как объединить два и более массива объектов в один с уникальными ключами - PullRequest
1 голос
/ 17 мая 2019

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

вы можете увидеть демо https://jsfiddle.net/shuts13/hn52vpxf/

У меня есть массив массивов:

const setOfArrays = [
[
{
     'dateTime': 1531612800000,
     'value': 97.0,
     'rangeMin': 79.0,
     'rangeMax': 110.0
},
{
     'dateTime': 1531512800000,
     'value': 96.0,
     'rangeMin': 79.0,
     'rangeMax': 110.0
}],
[{

      'dateTime': 1544745600000,
      'value': 82.7,
      'goal': 77.0

},{

      'dateTime': 1544745600000,
      'value': 81,
      'goal': 77.0

}],
[{
     'dateTime': 1531612800000,
     'value': 66.0,
     'rangeMin': 50.0,
     'rangeMax': 80.0
},{
     'dateTime': 1531612800000,
     'value': 65.0,
     'rangeMin': 50.0,
     'rangeMax': 80.0
}]
]

что я ожидал получить на выходе

[
{
     'dateTime': 1531612800000,
     'value': 97.0,
     'rangeMin': 79.0,
     'rangeMax': 110.0,

     'dateTime1': 1544745600000,
     'value1': 82.7,
     'goal1': 77.0,

     'dateTime2': 1531612800000,
     'value2': 66.0,
     'rangeMin2': 50.0,
     'rangeMax2': 80.0

},
{
     'dateTime': 1531512800000,
     'value': 96.0,
     'rangeMin': 79.0,
     'rangeMax': 110.0,

      'dateTime1': 1544745600000,
      'value1': 81,
      'goal1': 77.0,

     'dateTime2': 1531612800000,
     'value2': 65.0,
     'rangeMin2': 50.0,
     'rangeMax2': 80.0
}
]

код, который я написал, неверен, значение дублируется, я не знаю, что не так

Ответы [ 2 ]

3 голосов
/ 17 мая 2019

Использование Array.reduce , Array.forEach , Object.entries , Object.values ​​ & Object.assign

  • Идея состоит в том, чтобы создать объект с ключом в качестве вложенного массива index и значением в качестве object как в результирующем массиве. А затем используйте Object.values, чтобы получить массив результатов.
  • Итак, чтобы создать объект из данного массива, мы будем использовать Array.reduce, где для каждого элемента в массиве мы будем выполнять следующее действие
  • Переберите массив объектов item и проверьте, существует ли объект в сокращенном объекте для данного индекса
  • Если запись не найдена, добавьте запись в объект со значением как объект {...o}
  • Иначе, если найдена запись, то для каждого ключа, значения в объекте item, обновить соответствующий объект

Примечание - Поскольку результирующий объект должен иметь длину вложенного массива, мы знаем, что количество ключей в результирующем объекте будет равно длине любого из вложенных массивов. Поэтому в a[i], i - индекс вложенного массива. Для значений мы знаем, что первый объект в первом массиве будет таким, какой он есть, а другие будут дополнены индексом массива j. Итак, мы проверили наличие объекта, соответствующего index в a, потому что для первых объектов массива он всегда будет неопределенным и, следовательно, мы будем добавлять ключ: значение в результирующий объект. Для других нам просто нужно выполнить цикл и суффикс с родительским итератором j как ${k}${j}

const setOfArrays = [[{'dateTime':1531612800000,'value':97.0,'rangeMin':79.0,'rangeMax':110.0},{'dateTime':1531512800000,'value':96.0,'rangeMin':79.0,'rangeMax':110.0}],[{'dateTime':1544745600000,'value':82.7,'goal':77.0},{'dateTime':1544745600000,'value':81,'goal':77.0}],[{'dateTime':1531612800000,'value':66.0,'rangeMin':50.0,'rangeMax':80.0},{'dateTime':1531612800000,'value':65.0,'rangeMin':50.0,'rangeMax':80.0}]];

const result = Object.values(setOfArrays.reduce((a,c,j) => {
  c.forEach((o,i) => {
    if(a[i]) Object.entries(o).forEach(([k,v]) => Object.assign(a[i], {[`${k}${j}`] : v}));
    else a[i] = {...o};
  });
  return a;
}, {}));
console.log(result);
2 голосов
/ 17 мая 2019

Исходя из вашего вывода, вы объединяете матрицу m x n в массив из n элементов (по столбцам)

Итак,

  • map поверходин из внутренних массивов.
  • Внутри, map over setOfArrays
  • Получить массив записей для текущего столбца из каждой строки, используя Object.entries().Используйте flatMap, чтобы сгладить массивы, возвращенные в один массив.
  • Добавить суффикс к каждому ключу, когда строка номер элемента матрицы не равен нулю.
  • Создать объект из объединенных записей, используя Object.fromEntries()

const setOfArrays = [[{'dateTime':1531612800000,'value':97.0,'rangeMin':79.0,'rangeMax':110.0},{'dateTime':1531512800000,'value':96.0,'rangeMin':79.0,'rangeMax':110.0}],[{'dateTime':1544745600000,'value':82.7,'goal':77.0},{'dateTime':1544745600000,'value':81,'goal':77.0}],[{'dateTime':1531612800000,'value':66.0,'rangeMin':50.0,'rangeMax':80.0},{'dateTime':1531612800000,'value':65.0,'rangeMin':50.0,'rangeMax':80.0}]];

const output = setOfArrays[0].map((obj, i) => {
  const entries = setOfArrays.flatMap((arr, j) => {
      const suffix = j || ''; // add index suffix for nonzero j
      return Object.entries(arr[i]).map(([k, v]) => [k+suffix, v]);
  })
  return Object.fromEntries(entries)
})

console.log(output)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...