![](/img/trans.png)
[英]What is the most elegant way to remove an array of properties from an object immutably in JavaScript?
[英]What's the best way to update some properties of an object immutably in JavaScript?
说我们有一个像这样的对象:
const obj = {
foo: {
a: { type: 'foo', baz: 1 },
b: { type: 'bar', baz: 2 },
c: { type: 'foo', baz: 3 }
}
}
现在,我要更新所有属性baz
到5
,如果type
的物业的foo
是foo
。 而且我想以不变的方式修改它,这意味着它不会修改原始对象,而是返回一个新对象。
我通常为浅层副本编写Object.create()
,但为深层副本(嵌套对象) JSON.parse(JSON.stringify(nestedObject))
const obj = {
foo: {
a: { type: 'foo', baz: 1 },
b: { type: 'bar', baz: 2 },
c: { type: 'foo', baz: 3 }
}
}
var temp = JSON.parse(JSON.stringify(obj))
for(var i in temp.foo) {
if(temp.foo[i].type == "foo") {
temp.foo[i].baz = 5;
}
}
console.log(temp);
console.log(obj);
Object.assign
非常适合此操作,来自docs :
Object.assign()方法用于将所有可枚举的自身属性的值从一个或多个源对象复制到目标对象。 它将返回目标对象。
您可以像这样使用它:
Object.assign(
{},
obj,
{
foo: {
a: {
baz: obj.foo.a.type === 'foo' ? 5 : obj.foo.a
}
}
}
);
您可以使用Object.entries()
, Array.prototype.map()
,传播元素,计算属性, Object.assign()
const obj = { foo: { a: { type: 'foo', baz: 1 }, b: { type: 'bar', baz: 2 }, c: { type: 'foo', baz: 3 } } } let key = Object.keys(obj).pop(); let res = {[key]: Object.assign({}, ...Object.entries(obj[key]) .map(([prop, {type,baz}]) => ({[prop]: {type,baz:type === "foo" ? 5 : baz}}) ))}; console.log(res, obj);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.