对不起标题,但我不知道如何解释。
该函数采用URI,例如:/ foo / bar / 1293。如果存在,该对象将存储在一个看起来像{foo:{bar:{1293:'content ...'}}}的对象中。该函数遍历URI中的目录并检查路径是否未定义,同时构建一个字符串,其后面的代码将使用eval()调用。包含代码的字符串看起来像 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;
}
}
答案 0 :(得分:1)
这里不需要评估。只需向下钻取并删除最后的属性:
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;
}
});
答案 1 :(得分:1)
你只需要一个辅助函数,它接受一个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];
}
而不是建立代码字符串,而是将名称附加到Array
,然后调用此代码而不是eval
。此代码假定检查路径是否存在已经完成,就像它们在该用法中一样。