2

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

该函数接受一个 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;
        }        
    }
4

2 回答 2

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;
    }
});
于 2012-10-23T14:45:10.890 回答
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];
}

而不是建立一个代码字符串,将名称附加到 aArray然后调用它而不是eval. 此代码假定已完成对路径是否存在的检查,因为它们将在该用法中进行。

于 2012-10-23T14:47:36.680 回答