Есть ли хороший способ объединить массив и объект в JavaScript? - PullRequest
0 голосов
/ 11 июля 2019

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

list: [
  {
    oldData: {
      title: 'abc',
      id: 1,
      date: '1982-09-30',
      budget: 250000,
    },
    newData: [
      {
        key: 1,
        data: null,
        value: 5,
      },
      {
        key: 2,
        data: null,
        value: 22,
      },
      ...
    ],
  },
  {
    oldData: {
      title: 'blablablaaaaa',
      id: 2,
      date: '2012-02-23',
      budget: 350000,
    },
    newData: [
      {
        key: 1,
        data: null,
        value: 35,
      },
      {
        key: 2,
        data: null,
        value: 41,
      },
      ...
    ],
  },
  ... some more datas...
]

как указано выше, имеется больше данных того же типа.

Мне нужно использовать oldData and newData вместе, поэтому я хочу объединить их.

Как можно объединить oldData and newData, чтобы было несколько наборов oldData and newData pairs?

например, [{ combineData: {...} }, { combineData: {...} }, ... }] здесь.

Я знаю, как объединить массив и массив, объект и объект, но я не знаю, как это сделать.

Есть ли хорошее решение?

Ответы [ 3 ]

1 голос
/ 11 июля 2019

Вы можете использовать map() в массиве. И используйте Object.assign() и оператор распространения, чтобы объединить все свойства всех элементов в newData в один объект.

const arr = [
  {
    oldData: {
      a:10,
      b:20
    },
    newData: [
      {
        c:30,
        d:40
      },
      {
        e:50,
        f:60
      }
    ],
  }
]
const res = arr.map(x => ({combinedData:{...x.oldData, ...Object.assign({}, ...x.newData)}}))
               
console.log(res)
0 голосов
/ 11 июля 2019

Ваш желаемый результат неясен, но вы сказали, что хотели старые / новые пары.Этот ответ отличается от других тем, что он создает массив объединенных объектов данных, состоящих из старых / новых пар, где значения oldData дублируются для отображения рядом с каждым соответствующим значением newData в пределах его элемента списка.

ваши исходные данные после первого обновления вопроса:

let list = [
   {
    oldData: { title: 'abc', id: 1, date: '1982-09-30', budget: 250000 },
    newData: [
      { key: 1, data: null, value: 5  },
      { key: 2, data: null, value: 22 },
      //...
    ],
  },
  {
    oldData: { title: 'blablablaaaaa', id: 2, date: '2012-02-23', budget: 350000 },
    newData: [
      { key: 1, data: null, value: 35 },
      { key: 2, data: null, value: 41 },
      //...
    ],
  },
  //... some more datas...
];

Этот код отображает каждый элемент списка {old,new[]} в массивы пар [{old,new}, {old,new}, ...], которые объединяются в последнем вызове reduce():

var combinedDatas = list
    .map(listItem => listItem.newData.map(newItem => ({ 
        oldData: listItem.oldData, 
        newData: newItem 
    })))
    .reduce();

console.log(JSON.stringify(oldNewCombos, null, 4));

создает список денормализованных пар:

[
    { list[0].oldData, list[0].newData[0] }, 
    { list[0].oldData, list[0].newData[1] },
    //...rest of list[0] oldData with newData[n] combos

    { list[1].oldData, list[1].newData[0] }, 
    { list[1].oldData, list[1].newData[1] },
    //...rest of list[1] oldData with newData[n] combos

    { list[2].oldData, list[2].newData[0] }, 
    { list[2].oldData, list[2].newData[1] },
    //...rest of list[2] oldData with newData[n] combos

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

Вы можете отобразить массив и использовать деструктуризацию объекта (...object) для создания нового комбинированного объекта:

const data = [
  {
    oldData: {
      foo: 'lorem',
    },
    newData: {
      bar: 'ipsum',
    },
  },
  {
    oldData: {
      foo: 'dolor',
    },
    newData: {
      bar: 'sit amet',
    },
  },
];

const combined = data.map(record => ({...record.oldData, ...record.newData}));
console.log(combined);

Это перезапишет дубликаты ключей, поэтому что-то вроде:

{
  oldData: {
    message: 'a',
  },
  newData: {
    message: 'b',
  },
}

станет:

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