2012-10-23 56 views
2

对不起,我不知道如何解释。如何在不使用eval的情况下完成此操作

该函数接受一个URI,例如:/ foo/bar/1293。如果存在,该对象将存储在一个类似{foo:{bar:{1293:'content ...'}}}的对象中。该函数遍历URI中的目录并检查该路径是否未定义,并同时用随后使用eval()调用的代码构建一个字符串。包含代码的字符串看起来像删除内存[“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; 
     }   
    } 

回答

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; 
    } 
}); 
+0

当然,不知道我在想什么......谢谢:) – xCander

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。此代码假定检查路径是否已经完成,因为它们将在该用法中使用。

+0

是的,它的工作原理,但我更喜欢在同一次迭代中验证路径和删除对象。 – xCander

相关问题