我正在寫一個函數,它將接收對象並修改對象內的字段(可能是嵌套字段)。例如,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;
};
}
這裏的正確方法是問你爲什麼*需要* modifyObj函數,並且幾乎可以肯定地修改那段代碼。 – lonesomeday 2014-10-02 16:39:14
這聽起來像是[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。爲什麼你需要以這種方式訪問深度嵌套的屬性?這聽起來像是你以錯誤的方式接近你的根源問題。 – zzzzBov 2014-10-02 16:39:37