Как объединить один массив объектов на основе нескольких свойств - PullRequest
0 голосов
/ 30 ноября 2018

Используя javascript, у меня есть массив объектов, который выглядит следующим образом:

id |    date    | store |  type  | txn  | failed
------------------------------------------------
 1 |  10-02-18  |  32   |  short |  4   | false
 2 |  10-02-18  |  32   |  long  | null | true
 3 |  10-03-18  |  32   |  short |  7   | false
 4 |  10-03-18  |  32   |  long  |  10  | false

Я хочу иметь возможность преобразовать этот массив в нечто, похожее на это:

[
 {
   date: 10-02-18,
   store: 32,
   short: {
     txn: 4,
     failed: false,
   },
   long: {
     txn: null,
     failed: true,
   },
 },
 {
   date: 10-03-18,
   store: 32,
   short: {
     txn: 7,
     failed: false,
   },
   long: {
     txn: 10,
     failed: true,
   },
 }
]

Вы можете видеть, что я хотел бы объединить свойства "type", "txn" и "failed" со строкой, которые имеют одинаковые "date" и "storeId", добавив "type" в качестве свойства и "txn" и "не удалось "как дочерние свойства" типа ".Свойство "id" может быть проигнорировано в новом массиве.

Я довольно часто использую lodash, но это не является обязательным требованием.Я просто изо всех сил пытаюсь обернуть голову, как сделать это преобразование.

1 Ответ

0 голосов
/ 30 ноября 2018

Вам просто нужно создать объект с ключами, представляющими что-то уникальное для нужных вам групп.Например, вы можете сделать ключи, которые являются конкатенациями store_date, и объект будет иметь только один из них, и его можно будет быстро получить, если у вас есть хранилище и дата.Вы можете построить такой объект с помощью Reduce.Получив объект, вы можете просто вызвать Object.values, чтобы получить массив значений.Например:

let arr = [
    {id:1, date: "10-02-18",store: 32, type: "short", tx: 4, failed: false},
    {id:2, date: "10-02-18",store: 32, type: "long", tx: null, failed: true},
    {id:3, date: "10-03-18",store: 32, type: "short", tx: 7, failed: false},
    {id:4, date: "10-03-18",store: 32, type: "long ", tx: 10, failed: false}
]

let obj = arr.reduce((obj, {id, date, store, type, tx, failed}) => {
    // make a unique key
    key = `${date}_${store}`

    // if we haven't seen this key add it with the outline of the object
    if(!obj[key]) obj[key] = {date, store}

    // add specific type to either the found obj or the new one
    obj[key][type] = {tx, failed}
    return obj
}, {})

// obj is an object keyed to date_store
// get just the values
console.log(Object.values(obj))
...