Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';在JavaScript中不可变地更新对象的某些属性的最佳方法是什么?_Javascript_Functional Programming_Immutability - Fatal编程技术网

什么';在JavaScript中不可变地更新对象的某些属性的最佳方法是什么?

什么';在JavaScript中不可变地更新对象的某些属性的最佳方法是什么?,javascript,functional-programming,immutability,Javascript,Functional Programming,Immutability,假设我们有这样一个对象: const obj = { foo: { a: { type: 'foo', baz: 1 }, b: { type: 'bar', baz: 2 }, c: { type: 'foo', baz: 3 } } } 现在,如果foo中属性的type为foo,我想将所有属性“baz更新为5。我想以不可变的方式修改它,这意味着它不会修改原始对象,而是返回一个新对象。对象。assign非常适合于此,从以下方面: assign()方法用于将所有

假设我们有这样一个对象:

const obj = {
  foo: {
    a: { type: 'foo', baz: 1 },
    b: { type: 'bar', baz: 2 },
    c: { type: 'foo', baz: 3 }
  }
}

现在,如果
foo
中属性的
type
foo
,我想将所有属性“
baz
更新为
5
。我想以不可变的方式修改它,这意味着它不会修改原始对象,而是返回一个新对象。

对象。assign
非常适合于此,从以下方面:

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={
傅:{
a:{type'foo',baz:1},
b:{type:'bar',baz:2},
c:{type'foo',baz:3}
}
}
让key=Object.keys(obj.pop();
让res={[key]:Object.assign({},
…Object.entries(obj[key])
.map(([prop,{type,baz}])=>
({[prop]:{type,baz:type===“foo”?5:baz})
))};

控制台日志(res,obj)我通常为浅拷贝编写
Object.create()
,但为深拷贝(嵌套对象)编写
JSON.parse(JSON.stringify(nestedObject))


你是说你想要一个新的
{type:'foo':baz:5}
对象,还是想要一个全新的
obj
对象?你可以深度复制
obj
,然后对copyYes,@JaromandaX!但是,如果对象是大对象,则深度复制(如
。.deepClone
)可能会有性能问题。没有深度复制有什么想法吗?好吧,如果你想
obj
是不可变的,那么你就必须进行深度复制-这取决于你所指的不可变部分,我猜“可能有性能问题”-要么你想要深度复制,要么你不想要。如果不复制旧对象,则无法获取新对象。也许您可以通过提问更清楚地显示所需的输出。。。例外情况是日期、函数、DOM节点等。
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);