怎么把数组中的有规律的多个对象合并成一个?

[{
    method:'fly',
    code:'1',
    count:1,
},{
    method:'fly',
    code:'1',
    count:2,
}]
[{
    method:'fly',
    code:'1',
    count:3,//count相加了
}]

自己实现了一个,不知道有么有bug,求指点

function mergeOrder(order) {
    return order.reduce((a, b) => {

        let flag = a.some((item, index) => {
            return item.method === b.method && item.code === b.code;
        });
        if (flag) {
            for (let item of a) {
                if (item.method === b.method && item.code === b.code) {
                    item.count += b.count;
                }
            }
        } else {
            a.push(b);
        }
        return a;
    }, [{
        method: '',
        code: '',
        count: 0
    }]);
}
阅读 4k
3 个回答

如下,result是你想要得到的数组:

var result = [];
var arr = [{
    method:'fly',
    code:'1',
    count:1,
},{
    method:'fly',
    code:'1',
    count:2,
}];
for(var i =0; i< arr.length; i++){
    var isFind = false;
    for(var j =0 ; j< result.length; j++){
        if(arr[i].method === result[j].method &&  arr[i].code === result[j].code){
            result[j].count += arr[i].count;
            isFind = true;
            break;
        }
    }
    if(!isFind)
      result.push(arr[i]);
}

请用哈希,还有你的“相似”太含糊,用 method 和 code 做 key 了

var data = [{
    method:'fly',
    code:'1',
    count:1,
},{
    method:'fly',
    code:'1',
    count:2,
}]

let newData = Array.from(data.reduce((m, {method, code, count}) => {
  let k = `${method}:${code}`
  let x = m.get(k) || {method, code, count: 0}
  x.count += count
  return m.set(k, x)
}, new Map()).values())

console.log(newData)

var arr= [{
method:'fly',
code:'1',
count:1,
},
{
method:'fly',
code:'1',
count:2,
},
{
method:'pp',
code:'2',
count:2,
},
{
method:'pp',
code:'2',
count:2,
},
{
method:'qwe',
code:'3',
count:2,
},
]
var marr=[], carr=[], ccarr=[];    //分批次装3个元素
for(let item of arr){
    marr.push(item.method);
    carr.push(item.code);
    ccarr.push(item.count?item.count:0);
}
var newarr=[];
for(let i = marr.length-1; i > 0 ; i--){
    if(marr[i]===marr[i-1] && carr[i]===carr[i-1]){
        //移除后一位
        marr.splice(i,1);
        carr.splice(i,1);
        ccarr[i-1] = ccarr[i]+ccarr[i-1];
        ccarr.splice(i,1);
    }else{
    }
}
for(let i = 0; i < marr.length ; i++){
    newarr.push({
        method: marr[i],
        code: carr[i],
        count: ccarr[i]
    })
}
console.log(newarr);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题