[JS]更改多级对象值

时间:2016-03-02 22:37:04

标签: javascript json

var obj = {
    a:{
        value: 1
    }
}

var str = 'a.value';

obj[str] = 'work';
console.log(obj);

我有这段代码,我需要使用字符串

更改对象的值

3 个答案:

答案 0 :(得分:1)

您需要拆分路径并将其用作对象的键。

如果键不是对象,则创建新对象。

function set(obj, path, value) {
    var p = path.split('.'),
        last = p.pop();
    p.reduce(function (o, k) {
        if (typeof o[k] !== 'object') {
            o[k] = {};
        }
        return o[k];
    }, obj)[last] = value;
}

var obj = { a: { value: 1 } };

set(obj, 'a.value', 'work');
set(obj, 'b.value', 42);
set(obj, 'c', 'c');
console.log(obj);
set(obj, 'c.value', 'work');
console.log(obj);

ES6

function set(obj, path, value) {
    var p = path.split('.'),
        last = p.pop();
    p.reduce((o, k) => o[k] = typeof o[k] === 'object' ? o[k] : {}, obj)[last] = value;
}

var obj = { a: { value: 1 } };

set(obj, 'a.value', 'work');
set(obj, 'b.value', 42);
set(obj, 'c', 'c');
console.log(obj);
set(obj, 'c.value', 'work');
console.log(obj);

答案 1 :(得分:1)

递归解决方案

var obj = {
    a: {
        value: 1
    }
}

var str = 'a.value';

function change(obj, prop, newValue) {
    var a = prop.split('.');
    return (function f(o, v, i) {
        if (i == a.length - 1) {
            o[a[i]] = v;
            return o;
        }
        return f(o[a[i]], v, ++i);
    })(obj, newValue, 0);
}

var result = change(obj, str, 'work');

console.log(JSON.stringify(obj, 0, 2));

答案 2 :(得分:-2)

您可以尝试使用eval()

eval('obj.'+str + '="work"');