[英]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));
您可以使用_.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.