2012-10-23 93 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

相關問題