我想用点表示法设置对象的值,但不使用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
答案 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; }