合并JSON数组中的重复值(下划线或lodash最好)

时间:2017-07-06 22:50:32

标签: javascript arrays json underscore.js lodash

我想合并JSON数组的一些具有特定键重复值的对象。

我有json数组像这样:

var data=[
    { type:"XO",
      logID:"213323",
      user:"34324234"
    },
    { type:"YO",
      logID:"2323323",
      user:"1212234"
    },
    { type:"XO",
      logID:"676323323",
      user:"45465412234"
    },
    ,
    { type:"ZO",
      logID:"1231434323",
      user:"35739434"
    }
]

这里我想根据键'type'合并JSON对象。所以同样的类型看起来像这个新键:

var expectedOutput:[
     { 
        type:XO,
        text: [
            {
              logID:"213323",
              user:"34324234"
            },
            {
              logID:"676323323",
              user:"45465412234"
            }
        ]
     },
     { type:"YO",
       text:[
         {
         logID:"2323323",
         user:"1212234"
        }  
      ]
     },
     {
       type:"ZO",
       text:[ 
           {
             logID:"1231434323",
             user:"35739434"
           } 
        ]
     }
]

1 个答案:

答案 0 :(得分:2)

您可以使用lodash#groupBytype对集合进行分组,使用lodash#map将每个组对象格式转换为组数组格式。要从type数组中删除text属性,我们将使用lodash#omit部分应用lodash#partial函数。

var result = _(data)
  .groupBy('type')
  .map(function(group, type) {
    return {
      type: type,
      text: _.map(group, _.partial(_.omit, _, 'type'))
    };
  })
  .value();

var data = [{
    type: "XO",
    logID: "213323",
    user: "34324234"
  },
  {
    type: "YO",
    logID: "2323323",
    user: "1212234"
  },
  {
    type: "XO",
    logID: "676323323",
    user: "45465412234"
  },
  {
    type: "ZO",
    logID: "1231434323",
    user: "35739434"
  }
];

var result = _(data)
  .groupBy('type')
  .map(function(group, type) {
    return {
      type: type,
      text: _.map(group, _.partial(_.omit, _, 'type'))
    };
  })
  .value();
  
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>