繁体   English   中英

如何通过特定键合并数组中的项目?

[英]How to merge items in an array by specific key?

我有一个具有多个属性的JavaScript对象,这些属性的值是一个项目数组(类型,计数,senderUserName)。

我想合并这些数组中具有相同类型的项目,同时保留它们最初对应的键。

这是我的数组对象的示例:

{C.J :[
  {"type":"call","count":2,"senderUserName":"C.J.Rosati"},   
  {"type":"email","count":0,"senderUserName":"C.J.Rosati"},
  {"type":"sms","count":1,"senderUserName":"C.J.Rosati"},
  {"type":"sms","count":0,"senderUserName":"C.J.Rosati"},
  {"type":"email","count":6,"senderUserName":"C.J.Rosati"}
],
Will :[
  {"type":"call","count":2,"senderUserName":"Will"},   
  {"type":"email","count":1,"senderUserName":"Will"},
  {"type":"sms","count":0,"senderUserName":"Will"},
  {"type":"call","count":1,"senderUserName":"Will"},
  {"type":"call","count":1,"senderUserName":"Will"},
]}

我想要的结果是:

{C.J :[
  {"type":"call","count":2,"senderUserName":"C.J.Rosati"},   
  {"type":"email","count":6,"senderUserName":"C.J.Rosati"},
  {"type":"sms","count":1,"senderUserName":"C.J.Rosati"}
],
Will :[
  {"type":"call","count":4,"senderUserName":"Will"},   
  {"type":"email","count":1,"senderUserName":"Will"},
  {"type":"sms","count":0,"senderUserName":"Will"},
]}

我一直在尝试用lodash方法获得结果,但是没有任何运气。 我想我可能必须使用_.map_.reduce的组合,但不知道如何正确地将它们组合在一起。

您可以使用纯javascript中的reduce()forEach()做到这一点。

 var data = {'CJ' :[ {"type":"call","count":2,"senderUserName":"CJRosati"}, {"type":"email","count":0,"senderUserName":"CJRosati"}, {"type":"sms","count":1,"senderUserName":"CJRosati"}, {"type":"sms","count":0,"senderUserName":"CJRosati"}, {"type":"email","count":6,"senderUserName":"CJRosati"} ], 'Will' :[ {"type":"call","count":2,"senderUserName":"Will"}, {"type":"email","count":1,"senderUserName":"Will"}, {"type":"sms","count":0,"senderUserName":"Will"}, {"type":"call","count":1,"senderUserName":"Will"}, {"type":"call","count":1,"senderUserName":"Will"}, ]} result = Object.keys(data).reduce(function(r, e) { var ar = []; data[e].forEach(function(a) { if (!this[a.type]) { this[a.type] = a; ar.push(this[a.type]) } else { this[a.type].count += a.count; } }, {}) r[e] = ar; return r; }, {}) console.log(result) 

当然,这就是说,如果您有ES6,并且不打算在较旧的浏览器中运行此客户端。

如果您使用lodash设置-您可以执行以下操作:

var data = {"C.J" :[
{"type":"call","count":2,"senderUserName":"C.J.Rosati"},   
{"type":"email","count":0,"senderUserName":"C.J.Rosati"},
{"type":"sms","count":1,"senderUserName":"C.J.Rosati"},
{"type":"sms","count":0,"senderUserName":"C.J.Rosati"},
{"type":"email","count":6,"senderUserName":"C.J.Rosati"}
],
"Will" :[
{"type":"call","count":2,"senderUserName":"Will"},   
{"type":"email","count":1,"senderUserName":"Will"},
{"type":"sms","count":0,"senderUserName":"Will"},
{"type":"call","count":1,"senderUserName":"Will"},
{"type":"call","count":1,"senderUserName":"Will"},
]}

var combined_data = _.map(data, function(element, key){
  var collapsed_element = [];
  var element_type_hash = {};
  _.each(element, function(record){
    if(element_type_hash[record.type] !== undefined){
      element_type_hash[record.type].count += record.count;
    }   else
    {
      element_type_hash[record.type] = record;
    }
  });
  _.each(element_type_hash, function(element_obj){
    collapsed_element.push(element_obj);
  });

  return collapsed_element;
});

console.log(JSON.stringify(combined_data));

https://jsfiddle.net/oumba4p5/1/

您可以使用_.transform()将键收集到字典中,并使用_.values()提取组合值:

 var data = { 'CJ' :[ {"type":"call","count":2,"senderUserName":"CJRosati"}, {"type":"email","count":0,"senderUserName":"CJRosati"}, {"type":"sms","count":1,"senderUserName":"CJRosati"}, {"type":"sms","count":0,"senderUserName":"CJRosati"}, {"type":"email","count":6,"senderUserName":"CJRosati"} ], 'Will' :[ {"type":"call","count":2,"senderUserName":"Will"}, {"type":"email","count":1,"senderUserName":"Will"}, {"type":"sms","count":0,"senderUserName":"Will"}, {"type":"call","count":1,"senderUserName":"Will"}, {"type":"call","count":1,"senderUserName":"Will"}, ] }; var result = _.transform(data, function(result, value, key) { // transform the original object result[key] = _(value) .transform(function(merged, obj) { // transform the array of objects if(merged[obj.type]) { // if the type key already exists merged[obj.type].count += obj.count; // add to count } else { // if not merged[obj.type] = obj; // the obj will be used for the type property } }) .values() // take just the values .value(); }); console.log(result); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script> 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM