Сформировать массив внутри перебора reduce es6 Javascript

198
17 июля 2021, 18:20

Есть массив объектов

  [
  {
    "id": 96,
    "NAME": "Алексей Никашкин",
    "PRODUCT": "BMK-60-3DU (до 60 кВт, подкл. котла G 1″, 1+1+1 контура G ¾″)",
    "WELD_LENGTH": "300",
    "DATE": "01.04.2019",
    "DATE_TIMESTAMP": 1554066000,
    "QUANTITY": "1"
  },
  {
    "id": 97,
    "NAME": "Алексей Никашкин",
    "PRODUCT": "BMK-60-4D (до 60 кВт, подкл. котла G 1″, 3+1 контура G ¾″)",
    "WELD_LENGTH": "400",
    "DATE": "02.04.2019",
    "DATE_TIMESTAMP": 1554066000,
    "QUANTITY": "3"
  },
  {
    "id": 98,
    "NAME": "Алексей Морозов",
    "PRODUCT": "BMK-60-5DU (до 60 кВт, подкл. котла G 1″, 2+2+1 контура G ¾″)",
    "WELD_LENGTH": "500",
    "DATE": "02.04.2019",
    "DATE_TIMESTAMP": 1554066000,
    "QUANTITY": "5"
  },      {
    "id": 99,
    "NAME": "Алексей Морозов",
    "PRODUCT": "BMK-60-5DU (до 60 кВт, подкл. котла G 1″, 2+2+1 контура G ¾″)",
    "WELD_LENGTH": "500",
    "DATE": "03.04.2019",
    "DATE_TIMESTAMP": 1554066000,
    "QUANTITY": "3"
  }
]

UPDATED: Хочется получить массив объектов вида:

[
  {
    "date": ["01.04.2019", "02.04.2019", "03.04.2019"],
    "name": "Алексей Морозов"
  },
  {
    "date": ["01.04.2019", "02.04.2019", "03.04.2019"],
    "name": "Алексей Никашкин"
  }
]

Но получаю в таком виде:

{
  "Алексей Морозов": {
    "label": "Алексей Морозов",
    "data": [
      "02.04.2019",
      "03.04.2019",
      "01.04.2019",
      "04.04.2019",
      "05.04.2019"
    ]
  },
  "Алексей Никашкин": {
    "label": "Алексей Никашкин",
    "data": [
      "02.04.2019",
      "01.04.2019",
      "03.04.2019",
      "04.04.2019",
      "05.04.2019"
    ]
  }
}

Проблема в том что ключами родительских объектов являются имена -
}, "Алексей Никашкин": { "label": "Алексей Никашкин", "data": [ "02.04.2019", "01.04.2019", "03.04.2019", "04.04.2019", "05.04.2019" ] }, а мне нужно получить просто массив объектов Друг за другом. Экспортирую в chart.js

Пример кода:

        let data  = rows.reduce(function(result, value){
            let name = value['NAME'];
            let date = value['DATE'];
            if(!result.hasOwnProperty(name)) {
                result[name] = { label: name, data: [] };
            }
            /* Записали даты в массив */
            result[name].data.push(date);
            /* Оставили только уникальные значения */
            result[name].data = Array.from(new Set([...result[name].data]));
            return result;
        }, {});
Answer 1

При добавлении нового человека создаете объект с именем и пустым масивом дат. И потом просто пополняете этот массив.

var data=[{"id":96,"NAME":"Алексей Никашкин","DATE":"01.04.2019",},{"id":97,"NAME":"Алексей Никашкин","DATE":"02.04.2019",},{"id":98,"NAME":"Алексей Морозов","DATE":"02.04.2019",},{"id":99,"NAME":"Алексей Морозов","DATE":"03.04.2019",}, {"id":100,"NAME":"Алексей Морозов","DATE":"03.04.2019",}]; 
 
var result  = data.reduce(function(acc, v){ 
                     let name = v.NAME; 
                     if(! (name in acc) ) { 
                         acc[name] = { name: name, dates: [] }; 
                     }  
                     if( acc[name].dates.indexOf(v.date) == -1){ 
                         acc[name].dates.push(v.DATE); 
                     } 
                      
                     return acc; 
                  }, {}); 
 
result = Object.keys(result).map( k => result[k] ); 
 
console.log(result);

READ ALSO
Как использовать в конструкторе метод в методе с таймаутом?

Как использовать в конструкторе метод в методе с таймаутом?

Вызываю метод sayMeow() в методе voice() без таймаутаВсе норм

201
js замена слова на всей странице

js замена слова на всей странице

Можно ли как-то улучшить код и написать все более эффективно?

256
разбивка строки на массив

разбивка строки на массив

Как из такой Organization/LimitedCompany/HousingCooperative строки можно сделать массив такого вида: ['Organization', 'Organization/LimitedCompany', 'Organization/LimitedCompany/HousingCooperative']?

171
Nuxt Vuetifi, переопределение стилей scss

Nuxt Vuetifi, переопределение стилей scss

В продакшен версии мои стили перебиваются стилями vuetify

217