Как объединить / сгруппировать два значения объектов массива по датам - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь отобразить график, используя Несколько значений Amchart информация поступает из ElasticSearch. И это мой код JS:

$.get(URI).then(resp => JSON.parse(resp))
            .then(values => {
                console.log(values)
                var data = [],
                values.map(e => e._source) //From Elastic the info is inside '_source' key  
                    .map((n, i) => {
                        n.date = moment(n.date).format('Y-MM-DD');
// I'm trying to format date, because it cames with Hour:Min:Sec and if I 
// try to compare dates it wont be equal (NOT USING IN THIS ATTEMPT)
                        if (n.warehouse.name === 'General') {
                            data.push({date: n.date, general: n.assessment});
                        } else {
                            data.push({date: n.date, intransit: n.assessment});
                        }

                    });

            })
            .fail(err => console.error(err.response));

Это вывод с этим кодом:


0: {date: "2019-07-10", intransit: 1234.23}
1: {date: "2019-07-10", general: 1234.23}
2: {date: "2019-07-12", intransit: 1234.23}
3: {date: "2019-07-12", general: 1234.23}

Как видите, дата дублируется, как я могу объединить / сгруппировать оба, но без потери значения? Информация должна быть такой:

0: {date: "2019-07-10", intransit: 1234.23, general: 1234.23}
2: {date: "2019-07-12", intransit: 1234.23, general: 1234.23}

Если вы не можете визуализировать структуру из Elastic, это вывод из console.log (values):

_source: {date: "2019-07-10", assessment: 123.12, 
warehouse: {id: 1, name: "General"}

Я пробовал с Lodash / UnderscoreJS, циклами и т. Д ... и ничего. Если вы знаете какой-либо совет или что-нибудь по этому поводу, будет признателен. Спасибо.

Ответы [ 2 ]

0 голосов
/ 12 июля 2019

Вот решение, основанное на Lodash-fp

const dateMerger = _.flow([
    _.groupBy('date'),
    _.values,
    _.map(_.reduce(_.merge, {}))
]);

const dateData = [
    {date: "2019-07-10", intransit: 1234.23},
    {date: "2019-07-10", general: 1234.23},
    {date: "2019-07-12", intransit: 1234.23},
    {date: "2019-07-12", general: 1234.23}
];

console.log(dateMerger(dateData));

enter image description here

0 голосов
/ 11 июля 2019

Используйте reduce() для создания объекта groupBy или Карты, используя даты в качестве ключей, затем возвращайте values

const data = [ {date: "2019-07-10", intransit: 1234.23}, {date: "2019-07-10", general:1234.23}, {date: "2019-07-12", intransit: 1234.23},{date: "2019-07-12", general:1234.23}]

const res = Object.values(
  data.reduce((a, c) => {
    a[c.date] = a[c.date] || {};
    Object.assign(a[c.date], c);
    return a;
  }, {})
)


console.log(res)
...