2014-10-02 58 views
0

我正在寫一個函數,它將接收對象並修改對象內的字段(可能是嵌套字段)。例如,modifyObj(obj,'nested.nested',2)基本上會做obj.nested.nested = 2。最直接的方法似乎是使用eval,但共識似乎是使用eval是邪惡的? http://jsfiddle.net/zntf6bfw/在對象中設置深度嵌套屬性時,是否使用了eval?

function modifyObj(obj, field, val) { 
    var str = 'obj.' + field + '=' + val; 
    eval(str); 
} 

的替代方法是使用正則表達式來確定是否在字段通過嵌套,並且如果是這樣,使用循環得到一個嵌套的對象,並修改它(這將修改整體對象)。但是,這看起來不必要的複雜,並且這將作爲eval的有效用例嗎?在一個對象設定深度嵌套屬性時

function modifyObj2(obj, field, val) { 
    //if we are modifying a nested val 
    if (/\./g.test(field)) { 
     var arr = field.split('.'), 
      temp = obj; 
     //we want temp to be equal to the nested object holding the nested field to be modified and changing this will modify the passed in object 
     for (var i = 0; i < arr.length - 1; i++) { 
      temp = temp[arr[i]]; 
     } 
     temp[arr.length - 1] = val; 
    } 
    //if we are modifying a non-nested val 
    else { 
     obj[field] = val; 
    }; 
} 
+2

這裏的正確方法是問你爲什麼*需要* modifyObj函數,並且幾乎可以肯定地修改那段代碼。 – lonesomeday 2014-10-02 16:39:14

+3

這聽起來像是[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。爲什麼你需要以這種方式訪問​​深度嵌套的屬性?這聽起來像是你以錯誤的方式接近你的根源問題。 – zzzzBov 2014-10-02 16:39:37

回答

1

是使用eval合適嗎?

號它打開了腳本直至編碼錯誤可能變成安全漏洞。

真正的問題是你有什麼問題會導致你相信eval是一個合理的解決方案。請看下面的代碼:

香草JS:
obj.foo.bar.baz.fizz.buzz = val; 
modifyObj功能:
modifyObj(obj, 'foo.bar.baz.fizz.buzz', val); 

兩者之一是簡潔,易讀,易調試,易於理解,並運行速度非常快。另一個是您的modifyObj功能。

+0

謝謝你的回答。這是爲我的後端代碼 - 我有一個對象,其中包含幾個嵌套字段,目前我有兩個單獨的方法來修改和保存該對象內的兩個單獨的字段mongodb(第一個基本上是obj.x和第二個是obj。 YZ)。我希望將這兩種方法合併爲一個函數,然後傳遞給字段以修改爲字符串('x'或'y.z')。我認爲這樣,我不必處理太多的條件陳述來確定通過的內容等。 – 2014-10-02 17:12:04

0

使用eval基本上總是可以避免的。

舉個簡單的任務像(一個嵌套)只使用一個簡單的辦法

function modifyObj(obj, field, val) { 
obj[field] = val; 
} 

如果場其實是在「託[3] .person.name」,那麼你將要使用的正則表達式方法或對象展平方法,如

function flatten(obj){ 
var root = {}; 
(function tree(obj, index){ 
    var suffix = toString.call(obj) == "[object Array]" ? "]" : ""; 
    for(var key in obj){ 
    if(!obj.hasOwnProperty(key))continue; 
    root[index+key+suffix] = obj[key]; 
    if(toString.call(obj[key]) == "[object Array]")tree(obj[key],index+key+suffix+"["); 
    if(toString.call(obj[key]) == "[object Object]")tree(obj[key],index+key+suffix+"."); 
    } 
})(obj,""); 
return root; 
} 

它也允許使用複雜的字符串。更多關於這裏:https://stackoverflow.com/a/25370536/1026459

相關問題