[JS]更改多级对象值

[JS]Change multi level object value

本文关键字:多级 对象 JS      更新时间:2023-09-26
var obj = {
    a:{
        value: 1
    }
}
var str = 'a.value';
obj[str] = 'work';
console.log(obj);

我有这段代码,我需要使用字符串更改对象的值

带递归的解决方案

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));

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

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

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);

你可以试试eval()

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