将对象数组聚合为对象javascript的单个不同值

问题描述

我想将对象数组聚合为单个对象,每个对象都具有不同的值。但是我的代码没有给我想要的输出。有人可以帮我吗?

My Input : 
    [{
        "obj1" : "value1","obj2" : ["abc","def"],"obj3" : ["ghi"],"obj4" : "value4",},{
        "obj1" : "value2","mno"],"obj3" : ["klm"],}]


Output I want:
{
    "obj1" : ["value1","value2"]
    "obj2" : ["abc","def","obj3" : ["ghi","klm"],"obj4" : ["value4"]
}

My Code:
const result = filterData.reduce((a,c) => 
  (Object.keys(c).map(k => a[k] = [...a[k] || [],c[k]]),a),{})

解决方法

您可以使用 array#reduce 从对象数组创建单个对象。您可以使用 Set 获得不同的值。

const data = [{ "obj1" : "value1","obj2" : ["abc","def"],"obj3" : ["ghi"],"obj4" : "value4",},{ "obj1" : "value2","mno"],"obj3" : ["klm"],}],result = data.reduce((r,o) => {
        Object.keys(o).forEach(k => {
          r[k] = [...new Set((r[k] || []).concat(o[k]))];
        });
        return r;
      },{});
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

,

这里我使用了 lodash 的一些帮助程序来解决您的问题。

const input = [{
        "obj1" : "value1",{
        "obj1" : "value2",}]
    
function customizer(objValue,srcValue) {
  if (_.isArray(objValue)) {
    return _.union(objValue,srcValue);
  }
}
    
const output = input.reduce((acc,cur) => {
  const modifiedCur = _.mapValues(cur,function(o) { return typeof o === 'string' ? [o]: o; }); 
  acc = _.mergeWith(acc,modifiedCur,customizer);
  return acc
},{})    
    
console.log(output)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>