Сортировать записи по дате, а затем раскрасить и объединить счетчики с помощью lodash

1

У меня есть массив объектов, которые я хочу сортировать по дате, а затем по цвету и суммировать события, используя lodash

InitialArray = [{"date":"2017-07-26","partner":"partner1","total":102,"occurrence":10},{"date":"2017-07-27","partner":"partner1","total":100,"occurrence":20},{"date":"2017-07-27","partner":"partner1","total":110,"occurrence":25},{"date":"2017-07-27","partner":"partner2","total":105,"occurrence":30}]

Мне нужно, чтобы он сортировался по дате, а затем по партнеру и суммировал общее количество и количество случаев на определенную дату. Поэтому мой последний массив должен выглядеть так:

FinalArray = [{"date":"2017-07-26","partner":"partner1","total":102,"occurrence":10},{"date":"2017-07-27","partner":"partner1","total":210,"occurrence":45},{"date":"2017-07-27","partner":"partner2","total":105,"occurrence":30}]

Я смог достичь результата не функциональным способом, но я бы хотел оптимизировать код и сделать его функциональным способом, используя lodash, поскольку проект уже использует его. Я смог найти пример, где я могу группировать по заданному и затем использовать оператор суммирования для объединения другого поля. Но не удалось найти какой-либо пример для группировки по 2 полям, а затем агрегировать. Любая помощь приветствуется.

Теги:
functional-programming
lodash

2 ответа

1

Сначала вы можете группировать элементы, а затем отображать агрегированные значения.

var initialArray = [{ date: "2017-07-26", partner: "partner1", total: 102, occurrence: 10 }, { date: "2017-07-27", partner: "partner1", total: 100, occurrence: 20 }, { date: "2017-07-27", partner: "partner1", total: 110, occurrence: 25 }, { date: "2017-07-27", partner: "partner2", total: 105, occurrence: 30 }],
    groups = ['date', 'partner'],
    result = _(initialArray)
        .groupBy(o => groups.map(k => o[k]).join('|'))
        .map((a, k) => ({
            date: a[0].date,
            partner: a[0].partner,
            total: _.sumBy(a, 'total'),
            occurrence: _.sumBy(a, 'occurrence')
        }))
        .value();

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>
0

Я думаю, что это дает результат, который вы хотите.

    var a = [   {"date":"2017-07-26","partner":"partner1","total":102,"occurrence":10},
                {"date":"2017-07-27","partner":"partner1","total":100,"occurrence":20},
                {"date":"2017-07-27","partner":"partner1","total":110,"occurrence":25},
                {"date":"2017-07-27","partner":"partner2","total":105,"occurrence":30}
            ];

var out = a.reduce( (s,e,i) => {
    if (i === 0)
        s.push(e);
    else
        if (typeof s.find( ss => ss.date == e.date && ss.partner == e.partner && (ss.total += e.total)) == 'undefined')
            s.push(e);
    return s;
}, []);
    console.log( out );

Ещё вопросы

Сообщество Overcoder
Наверх
Меню