如何做到这一点,而不使用eval

对不起,标题,但我不知道如何解释。

该函数采用URI,例如:/ foo / bar / 1293。 如果存在的话,该对象将存储在类似于{foo:{bar:{1293:'content …'}}}的对象中。 该函数迭代URI中的目录,并检查path是否未定义,同时用随后使用eval()调用的代码构build一个string。 包含代码的string看起来像delete memory [“foo”] [“bar”] [“1293”]

有没有其他办法可以完成这个? 也许将保存的内容存储在一个普通的对象以外的东西?

remove : function(uri) { if(uri == '/') { this.flush(); return true; } else { var parts = trimSlashes(uri).split('/'), memRef = memory, found = true, evalCode = 'delete memory'; parts.forEach(function(dir, i) { if( memRef[dir] !== undefined ) { memRef = memRef[dir]; evalCode += '["'+dir+'"]'; } else { found = false; return false; } if(i == (parts.length - 1)) { try { eval( evalCode ); } catch(e) { console.log(e); found = false; } } }); return found; } } 

这里不需要评估。 只要像你一样向下钻取,并在最后删除属性:

 parts.forEach(function(dir, i) { if( memRef[dir] !== undefined ) { if(i == (parts.length - 1)) { // delete it on the last iteration delete memRef[dir]; } else { // drill down memRef = memRef[dir]; } } else { found = false; return false; } }); 

你只需要一个帮助函数,它需要一个Array和一个对象,并执行:

 function delete_helper(obj, path) { for(var i = 0, l=path.length-1; i<l; i++) { obj = obj[path[i]]; } delete obj[path.length-1]; } 

而不是build立一个代码string,将名称追加到一个Array ,然后调用这个而不是eval 。 这段代码假设检查path是否存在已经完成了,因为它们在那个用法中。