根据两个属性清理对象阵列

时间:2018-01-23 17:59:01

标签: javascript arrays

我有一个像这样的对象数组:

const obj1 = [{
   id: null,
   val: 1
},{
   id: 123,
   val: 1
},{
   id: 456,
   val: 2
},{
   id: null,
   val: 3
}];

我需要检查属性'val'何时不会加倍,并且如果其中一个是double,则应该保持具有'id'的对象不为null。为了更好地解释我,数组的结果应该是:

[{
   id: 123,
   val: 1
},{
   id: 456,
   val: 2
},{
   id: null,
   val: 3
}];

感谢您帮助我。

2 个答案:

答案 0 :(得分:1)

可能有一个更短的方式,但你绝对可以使用reduce

来解决这个问题

const obj1 = [{
   id: null,
   val: 1
},{
   id: 123,
   val: 1
},{
   id: 456,
   val: 2
},{
   id: null,
   val: 3
}];

const result = obj1.reduce((res, item) => {
    // Find index of item with same "val" if any.
    const index = res.findIndex(x => x.val === item.val)
    if (res[index]) {
        // If there was item with same "val", but null ID, replace it, otherwise do nothing:
        if (res[index].id === null) res[index] = item;
    } else {
        // Otherwise just add to array.
        res.push(item);
    }
    
    return res;
}, []);

console.log(result)

答案 1 :(得分:0)

您可以使用Map并检查该值是否在地图中,或者id是否为空,然后使用实际对象设置地图。



var array = [{ id: null, val: 1 }, { id: 123, val: 1 }, { id: 456, val: 2 }, { id: null, val: 3 }],
    map = new Map(),
    result;
    
array.forEach(o => (!map.has(o.val) || map.get(o.val).id === null) && map.set(o.val, o));

result = [...map.values()];

console.log(result);

.as-console-wrapper { max-height: 100% !important; top: 0; }