首页 > 解决方案 > 将数组中的对象合并为一个

问题描述

我有一个对象数组如下:

arr = [  
    {  
        totalPrice:{  
            value:5,
            currencyId:0
        }
    },
    {  
        totalPrice:{  
            value:1,
            currencyId:0
        }
    },
    {  
        totalPrice:{  
            value:6,
            currencyId:0
        }
    }
]

如果所有 totalPrice 对象具有相同的 currencyId,我想要做的是获取一个包含价值总和的对象(totalPrice)。

第一步是确定所有的 totalPrice 对象是否具有相同的 currencyId:

var canBeMerged = arr.every(l => l.totalPrice.currencyId === arr[0].totalPrice.currencyId);

然后:

var merged = null;

if(canBeMerged){
    var valueSum = 0;

    for (var k=0; k<arr.length; k++) {
      valueSum += arr[k].totalPrice.value;
    }
      merged = {value: valueSum, currencyId: arr[0].totalPrice.currencyId}
}

有没有办法以单一方式完成所有这些工作?我认为 reduce 函数可以做到这一点,但我不知道该怎么做。

任何帮助,将不胜感激 :)

标签: javascript

解决方案


这使用一个对象来累积每个 的值currencyId

let merge = arr => {
  d = {};
  arr.forEach(a => d[a.totalPrice.currencyId] = (d[a.totalPrice.currencyId] ? d[a.totalPrice.currencyId] : 0) + a.totalPrice.value);
  return Object.entries(d).map(([k, i]) => ({ value: i, currencyId: parseInt(k) }));
}

例子:

>> arr = [  
        {  
            totalPrice:{  
                value:5,
                currencyId:0
            }
        },
        {  
            totalPrice:{  
                value:1,
                currencyId:0
            }
        },
        {  
            totalPrice:{  
                value:6,
                currencyId:0
            }
        }
    ]

>> merge(arr)
 [{ value:12, currencyId:0 }]

>> arr = [  
        {  
            totalPrice:{  
                value:5,
                currencyId:0
            }
        },
        {  
            totalPrice:{  
                value:1,
                currencyId:1
            }
        },
        {  
            totalPrice:{  
                value:6,
                currencyId:0
            }
        }
    ]

>> merge(arr)
 [{ value:11, currencyId:0 }, { value:1, currencyId:1 }]

推荐阅读