Итак, если у меня есть массив объектов:
var synched = [{
name = "something",
value = 11132
}, {
name = "something else",
value = 1231233
}...]
и другой массив, который почти такой же, но содержит некоторые другие значения:
var opened = [{
name = "something",
value = 1233312
}, {
name = "something else",
value = 12312333
}, {
name = "something",
value = 1241233
}]
Я хотел объединить их все в один массив объектов, в котором я подсчитал сумму достоверностей "имени" в любом массиве.
var result = [{
name: "something",
opened: 2,
synched: 1,
total: 3
}, {
name: "something else",
opened: 1,
synched: 1,
total: 2
}]
Есть ли более эффективный способ сделать это, чем несколько вызовов array.reduce
?
var data = synched.reduce(function (data, item) {
var key = item.name
var created = (data[key] || (data[key] = {'name': key, 'opened': 0, 'synched': 0, 'total': 0}));
created['synched'] += 1;
created['total'] += 1;
return data;
}, {});
var data1 = opened.reduce(function (data1, item) {
var key = item.name
var created = (data1[key] || (data1[key] = {'name': key, 'opened': 0, 'synched': 0, 'total': 0}));
created['opened'] += 1;
created['total'] += 1;
return data1;
}, {});
Object.keys(data).forEach(function (key) {
if(data1.hasOwnProperty(key)){
data1[key]['synched'] = data[key]['synched'];
data1[key]['total'] = data[key]['total'] + data1[key]['total'];
} else {
data1[key] = data[key];
}
});
var result = Object.keys(data1).map(function(item) { return data1[item]; });
РЕДАКТИРОВАТЬ:
После предложения @Pointy я могу сделать это:
var data1 = opened.reduce(function (data, item) {
var key = item.name
var created = (data[key] || (data[key] = {'name': key, 'opened': 0, 'synched': 0, 'total': 0}));
created['opened'] += 1;
created['total'] += 1;
return data;
}, data);
и это позволит мне избавиться от этой третьей итерации. Спасибо!