如何使用ES6在数组内设置对象的值?

时间:2018-09-24 07:56:12

标签: javascript ecmascript-6 ecmascript-7

我正在寻找在数组内设置对象值的最快,最资源友好的方法。也可以使用ES6语法。

所以说我有这个对象数组:

let index = group.findIndex(g => g.id === payload.id);

我想根据用户输入获取这些对象之一。假设我们要通过Obejct的ID获取第三项的索引:

group[index].id = payload.id;
group[index].name = payload.name;
group[index].geo = payload.geo;
group[index].car = payload.car;

一旦有了索引,我便想为该对象分配新值,如下所示:

permalink_structure

但是它又长又丑,想像一下您是否在该对象中有50个以上的值。

问题:有没有更短,更有效的方法来实现这一目标?还包括ES6-ES7语法。

4 个答案:

答案 0 :(得分:3)

您可以使用Array#findObject.assign来更改找到的对象的属性。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "ShoppingCardCell") as? ShppingCellCustomTableViewCell


    cell!.textLabel?.text = item[indexPath.row].productTitleCore

    //Remove or comment this line self.Tableview.reloadData()
    self.Tableview.reloadData()
    return cell!
}
var 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' },
    object = group.find(({ id }) => id === payload.id);

if (object) {
    Object.assign(object, payload);
}

console.log(group);

答案 1 :(得分:1)

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};
}

答案 2 :(得分:1)

使用索引。对于一次搜索和更新,Array.find效果很好。但是,如果您需要更新多个条目,则必须构建一个数组索引。

(function(){
    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' };
        
    let groupIndex = {};
    group.forEach(x => groupIndex[x.id]=x);

    let start = new Date().valueOf();
    let id = 1;
    let updates = 1000000;
    for(let i=0;i<updates;i++)
        if (groupIndex[id])
            Object.assign(groupIndex[id], payload);

    console.log(updates+" taken "+(new Date().valueOf()-start)+" ms");
})()

答案 3 :(得分:1)

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

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);