使用点表示法设置对象属性而不使用eval

时间:2018-02-02 19:19:40

标签: javascript object

我想用点表示法设置对象的值,但不使用eval。

所以来自

const a = {
    data: {
        clients:[
            {id:1, name:'Tom'},
            {id:2, name:'John'},
            {id:1, name:'Lucy'}
        ]
    }
}

我想将'John'的名字设为'Johny'。

点符号语法应为data.clients[1].name

使用eval是小菜一碟,但我不想使用eval

点符号来自一个变量,所以它也可以是任何有效(或无效)string

1 个答案:

答案 0 :(得分:2)

您只需要在属性前面添加变量名称。

a.data.clients[1].name = 'Johny';

如果您有一个字符串,则可以通过遍历给定对象来拆分路径并减少路径。如果不存在Object,请使用名称或数组创建新属性。稍后分配值。

function setValue(object, path, value) {
    var way = path.replace(/\[/g, '.').replace(/\]/g, '').split('.'),
        last = way.pop();

    way.reduce(function (o, k, i, kk) {
        return o[k] = o[k] || (isFinite(i + 1 in kk ? kk[i + 1] : last) ? [] : {});
    }, object)[last] = value;
}

const a = { data: { clients:[{ id:1, name:'Tom' }, { id:2, name:'John' }, { id:1, name:'Lucy' }] } };

setValue(a, 'data.clients[1].name', 'Johny');
console.log(a);
.as-console-wrapper { max-height: 100% !important; top: 0; }