【求助】如何缩水含有对象的数组(相同id的对象合计num值)

最近在重写背包道具整理的功能,需求简化为对含有对象的数组中相同id的对象合计他们的num值
假设数组内容为bagarr = [{id:1,num:10},{id:1,num:12},{id:2,num:50},{id:3,num:20},{id:3,num:50}];
背包数组bagarr事先已经经过id排序了,我想要得到的结果为:
[{id:1,num:22},{id:2,num:50},{id:3,num:70}];
两天了,怎么写都不对,第一次写的自己都看不懂居然能在nodejs环境实现,在项目里面报错
所以想重写,结果一直卡。

Object.entries(bagarr.reduce((map, item) => { map[item.id] = (map[item.id] || 0) + item.num; return map; }, Object.create(null))).map(([id, num]) => ({id: Number.parseInt(id), num}))

result: [{“id”:1,“num”:22},{“id”:2,“num”:50},{“id”:3,“num”:70}]

1赞

非常感谢,虽然我还看不太懂这段代码,我明天再结合api去分析一下。
明天应该就算是又学到一招了。
再次表示感谢,祝你明年工资翻番。

随便写了一段

var bagarr = [{ id: 1, num: 10 }, { id: 1, num: 12 }, { id: 2, num: 50 }, { id: 3, num: 20 }, { id: 3, num: 50 }]

    var tempArr = []
    var len = bagarr.length

    for (let index = 0; index < len; index++) {
        var item = bagarr[index]
        if (tempArr.length == 0) {
            tempArr.push(item)
        } else {
            var b = false
            for (let k = 0; k < tempArr.length; k++) {
                var item1 = tempArr[k]
                if (item1.id == item.id) {
                    item1.num += item.num
                    b = true
                    break
                }
            }
            if (!b) {
                tempArr.push(item)
            }
        }
    }

https://lodash.com/docs/4.17.15#mergeWith
你参考下这个库,实现类似下面这样,伪代码

let array1 = {};
for (const bag of bagarr) {
    array1 = _.mergeWith(array1, bag, (value1, value2) => {
        if (_.isNumber(value1)) {
            return value1 + (_.isNumber(value2) ? value2 : 0);
        }
    });
}

非常感谢。
只不过我现在发现我把问题想的太简单了,背包列表里面的道具情况有很多啊。
实际的需求是原则上只对可堆叠的道具进行处理(最大最堆叠为1的显然没有必要处理,
直接添加到临时数组就行了),然后针对玩家可能只对同种材料的一组加锁的情况做处理,
即同种材料只要有一组是加锁的,那么处理后所有的同名材料都是加锁的,甚至我在想要不要取消加锁设定了(原先是为了筛选可售卖道具而加入的设定)。
你写的这个我比较能直观的明白是怎么写的。
一楼的前辈写的我看了api也只能明白这么做可以实现需求,但是我模仿不了,不知道怎么修改把所有的可枚举属性都加进去。不然只能保留num属性有什么用啊,信息都丢失了。

谢谢,你写的我也能直观的明白。

前辈你好,我能再麻烦你一下吗?我看了api也只能明白这么做可以实现需求,但是我模仿不了,不知道怎么修改把所有的可枚举属性都加进去。不然只能保留num属性有什么用啊,信息都丢失了。
我现在发现我把问题想的太简单了,背包列表里面的道具情况有很多啊。实际的需求是原则上只对可堆叠的道具进行处理(最大最堆叠为1的显然没有必要处理,直接添加到临时数组就行了),然后针对玩家可能只对同种材料的一组加锁的情况做处理,即同种材料只要有一组是加锁的,那么处理后所有的同名材料都是加锁的,甚至我在想要不要取消加锁设定了(原先是为了筛选可售卖道具而加入的设定)。此外装备其实每一个信息都不同,强化星级、实际属性加成都不同,因此针对装备只能是一个id一个格子。情况更加复杂了。

复杂需求别学我这种风格来写,需求变复杂后,就得用更为容易看懂的方式实现,以免下次维护的时候没法改动