如何通过特定键合并数组中的项目?
我有一个拥有多个属性的JavaScript对象,这些属性的值是一个项目数组(type,count,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 = {'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"},
]}
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 = {
'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 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>
_(价值)的意义是什么?为什么要这样写呢? –
'_(value)'开始[lodash序列](https://lodash.com/docs/4.15.0#chain),'.value()'调用它并提取实际值。 –
谢谢@ nenad-vracar。完美工作! –