Javascript 如何设置对象';使用ES6在数组中设置值?

Javascript 如何设置对象';使用ES6在数组中设置值?,javascript,ecmascript-6,ecmascript-2016,Javascript,Ecmascript 6,Ecmascript 2016,我正在寻找一种在数组中设置对象值的最快、最节省资源的方法。也可以使用ES6语法 假设我有一组对象: let group = [ { id: 1, name: 'Test 1', geo: 'Japan', car: 'Toyota' }, { id: 2, name: 'Test 2', geo: 'USA', car: 'Tesla'

我正在寻找一种在数组中设置对象值的最快、最节省资源的方法。也可以使用ES6语法

假设我有一组对象:

let group = [
    {
        id: 1,
        name: 'Test 1',
        geo: 'Japan',
        car: 'Toyota'
    },
    {
        id: 2,
        name: 'Test 2',
        geo: 'USA',
        car: 'Tesla'
    },
    {
        id: 3,
        name: 'Test 3',
        geo: 'Germany',
        car: 'Audi'
    }
];
我想根据用户输入获取其中一个对象。假设我们希望通过Obejct的ID获取第三项的索引:

let index = group.findIndex(g => g.id === payload.id);
一旦我有了索引,我想给这个对象分配新的值,如下所示:

group[index].id = payload.id;
group[index].name = payload.name;
group[index].geo = payload.geo;
group[index].car = payload.car;
但是它又长又丑,想象一下,如果这个对象中有50多个值

问题:有没有更快捷、更有效的方法实现同样的目标?还包括ES6-ES7语法。

您可以使用和来更改找到的对象的属性

var group=[{id:1,名称:“测试1”,地理位置:“日本”,汽车:“丰田”},{id:2,名称:“测试2”,地理位置:“美国”,汽车:“特斯拉”},{id:3,名称:“测试3”,地理位置:“德国”,汽车:“奥迪”},
有效载荷={id:3,名称:'update',地理位置:'Germany Bavaria Ingolstadt',汽车:'Audi 1'},
object=group.find(({id})=>id==payload.id);
如果(对象){
分配(对象,有效载荷);
}
控制台日志(组)
.as控制台包装{max height:100%!important;top:0;}
您可以使用和来更改找到的对象的属性

var group=[{id:1,名称:“测试1”,地理位置:“日本”,汽车:“丰田”},{id:2,名称:“测试2”,地理位置:“美国”,汽车:“特斯拉”},{id:3,名称:“测试3”,地理位置:“德国”,汽车:“奥迪”},
有效载荷={id:3,名称:'update',地理位置:'Germany Bavaria Ingolstadt',汽车:'Audi 1'},
object=group.find(({id})=>id==payload.id);
如果(对象){
分配(对象,有效载荷);
}
控制台日志(组)

。作为控制台包装{最大高度:100%!重要;顶部:0;}
使用索引。对于一次性搜索和更新数组,find效果很好。但如果需要更新多个条目,则必须构建数组索引

(函数(){
组=[{id:1,名称:'Test 1',地理位置:'Japan',汽车:'Toyota'},{id:2,名称:'Test 2',地理位置:'USA',汽车:'Tesla'},{id:3,名称:'Test 3',地理位置:'Germany',汽车:'Audi'}],
有效载荷={id:3,名称:'update',地理位置:'Germany Bavaria Ingolstadt',汽车:'Audi 1'};
设groupIndex={};
group.forEach(x=>groupIndex[x.id]=x);
让开始=新日期().valueOf();
设id=1;
让更新=1000000;

对于(让i=0;i使用索引。对于一次性搜索和更新数组,find效果很好。但是如果需要更新多个条目,则必须构建数组索引

(函数(){
组=[{id:1,名称:'Test 1',地理位置:'Japan',汽车:'Toyota'},{id:2,名称:'Test 2',地理位置:'USA',汽车:'Tesla'},{id:3,名称:'Test 3',地理位置:'Germany',汽车:'Audi'}],
有效载荷={id:3,名称:'update',地理位置:'Germany Bavaria Ingolstadt',汽车:'Audi 1'};
设groupIndex={};
group.forEach(x=>groupIndex[x.id]=x);
让开始=新日期().valueOf();
设id=1;
让更新=1000000;

对于(设i=0;i以上给定的解决方案是正确的),您也可以在一行中使用map执行相同的操作(更喜欢使用lodash map函数)


以上给出的解决方案是正确的,您也可以在一行中使用map执行相同的操作(首选使用lodash map函数)


ID是唯一的吗?我的意思是,如果是这样,您可能根本不需要获取索引,解决方案将变得更加简洁。@vahdet是的,ID是唯一的。ID是唯一的吗?我的意思是,如果是这样,您可能根本不需要获取索引,解决方案将变得更加简洁。@vahdet是的,ID是唯一的。正如预期的那样完美工作。非常感谢您的支持这个!:-)如预期般完美。非常感谢!:-)无需使用
。查找
来定位对象,然后使用该对象…定位索引。这是对数组进行两次分析。您可以更改已更改数组的
el
,或者更改
findIndex
来仅获取索引。然后将索引设置为新对象意味着旧对象将被垃圾收集。或者更糟糕的是,没有GCed,因为某些东西已经引用了它,但它现在没有得到更新。不需要使用
。查找
来定位一个对象,然后使用该对象…定位索引。这是对数组进行两次解析。您可以更改已更改数组的
el
,也可以更改
findIndex
来获取索引dex。然后将索引设置为新对象意味着旧对象将被垃圾收集。或者更糟糕的是,由于某些对象已经引用了它,而它现在没有得到更新,所以没有GCed。需要注意的是,在这个解决方案中,您将用新对象替换整个对象,而在Nina和我的解决方案1中)您只替换两个对象中的键值(
有效负载
组[i]
)2)只在其中一个对象中的键的值将保留在新对象中。需要注意的是,在这个解决方案中,您将用一个新对象替换整个对象,而在Nina和mine的解决方案1)中,您仅替换两个对象中的键的值(
有效载荷
组[i]
)2)只有其中一个关键点的值将保留在新对象中。
el = group.find(g => g.id === payload.id);
if (el) { // add this 'if' if you are not sure if payload's id will be in group
  idx = group.indexOf(el);
  group[idx] = {...el, ...payload};
}
let group = [{ id: 1, name: 'Test 1', geo: 'Japan', car: 'Toyota' }, { id: 2, name: 'Test 2', geo: 'USA', car: 'Tesla' }, { id: 3, name: 'Test 3', geo: 'Germany', car: 'Audi' }],
payload = { id: 3, name: 'update', geo: 'Germany Bavaria Ingolstadt', car: 'Audi 1' }; 

group = group.map((item) => item.id === payload.id ? payload : item);