Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.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_Typescript_Redux - Fatal编程技术网

Javascript 使用扩展运算符更新包含对象的数组

Javascript 使用扩展运算符更新包含对象的数组,javascript,typescript,redux,Javascript,Typescript,Redux,我有一个数组,其中包含javascript/typescript中的对象 let array = [{id:1,name:'One'}, {id:2, name:'Two'}, {id:3, name: 'Three'}] 如何使用javascript spread(…)操作符更新第二个元素的名称(id为2)并将数组复制到新数组?可以混合使用和 可以在创建新数组后设置该值 let数组=[{id:1,名称:'One'},{id:2,名称:'Two'},{id:3,名称:'Three'}]; 设

我有一个数组,其中包含javascript/typescript中的对象

let array = [{id:1,name:'One'}, {id:2, name:'Two'}, {id:3, name: 'Three'}]
如何使用javascript spread(…)操作符更新第二个元素的名称(id为2)并将数组复制到新数组?

可以混合使用和

可以在创建新数组后设置该值

let数组=[{id:1,名称:'One'},{id:2,名称:'Two'},{id:3,名称:'Three'}];
设array2=array.map(a=>{return{…a}})
array2.find(a=>a.id==2);
console.log(数组);
控制台日志(array2)

。作为控制台包装{max height:100%!important;top:0;}
有几种方法可以做到这一点。我建议使用
Array.map

let new_array = array.map(element => element.id == 2 ? {...element, name : 'New Name'} : element);
或使用
对象。分配

let new_array = array.map(element => element.id == 2 ? Object.assign({}, element, {name : 'New Name'}) : element);
Map返回一个新数组,因此不需要数组扩展运算符

let数组=[{id:1,名称:'One'},{id:2,名称:'Two'},{id:3,名称:'Three'}];
让array2=[…array.slice(0,0),Object.assign({},array[0]{
名称:'new one'//更改idx的任何属性
}),…数组.切片(0+1)]
console.log(数组);
控制台日志(array2)我们可以使用

let array = [{id:1,name:'One'}, {id:2, name:'Two'}, {id:3, name: 'Three'}];
let array2 = [...array]
array2.find(a => a.id == 2).name = "Not Two";
console.log(array2);

您只需使用
map()
并在那里更改元素即可。 这是密码---


在这里,主数组也会被修改,因为数组中的元素是对象,即使在新数组中,它也会引用相同的位置。

您可以在
映射中这样做,无需
排列

const array = [{id:1,name:'One'}, {id:2, name:'Two'}, {id:3, name: 'Three'}]

const updatedArray = array.map(a => {
   if (a.id == 2) {
      a.name = 'New Name';
   }
   return a;
});

是否要对对象进行变异?或者克隆它并更改名称?我想接近一个新数组,保持现有对象不变。为什么不直接读取?如果你读了它,你会发现你想要什么是不可能的。Spread运算符不适用于此类阵列修改。我建议您改用下划线/Lodash库。我明白了,您有使用Lodash的例子吗。我希望使用类似于[…array.filter(a=>a.id!=2)、array.filter(a=>a.id==2)、name='updated name']的东西。但是,这将重新排列数组中的元素。它将返回一个新数组,但数组中的对象仍将是对原始数组对象的引用,因此是的,您确实需要spread运算符。不使用spread运算符,也不使用object.assign,将空对象作为目标。例如,执行
let new_array=array.map(e=>e.id==2?Object.assign(e,{name:'new name'}):e)
将改变Object这正是我所寻找的。谢谢。你能解释一下你在这段代码中做了什么,并在一个工作片段中提供吗?Javascript数组和对象是通过引用传递的,这意味着如果你有一个对象a,并且你做了B=a。如果你对a做了修改,B也会被更新,因为B引用A。这可能会导致跟踪数组和对象时出现一些奇怪的问题。本例所做的是创建一个新数组,将原始数组切片到要修改的索引,然后从要更改的对象加上更改的值创建一个新对象,然后将原始数组的其余部分切片,然后添加到后面。这是一个新的对象数组,不是引用。
const array = [{id:1,name:'One'}, {id:2, name:'Two'}, {id:3, name: 'Three'}]

const updatedArray = array.map(a => {
   if (a.id == 2) {
      a.name = 'New Name';
   }
   return a;
});