Есть ли способ применить уменьшение к двум массивам, но не сбрасывать аккумулятор между вызовами? - PullRequest
0 голосов
/ 06 сентября 2018

Итак, если у меня есть массив объектов:

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);

и это позволит мне избавиться от этой третьей итерации. Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...