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

问题描述:

我有一个拥有多个属性的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)

+0

谢谢@ nenad-vracar。完美工作! –

也就是说,当然,如果你有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 = { 
 
    '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>

+0

_(价值)的意义是什么?为什么要这样写呢? –

+0

'_(value)'开始[lodash序列](https://lodash.com/docs/4.15.0#chain),'.value()'调用它并提取实际值。 –