Сглаживание массива сложных объектов с атрибутом массива - PullRequest
1 голос
/ 28 июня 2019

Мне было интересно, есть ли быстрое решение (например, с использованием map ()) для преобразования многомерного массива в одномерный массив, который по-прежнему хранит всю информацию исходного массива.

Вы можете решить это с помощью нескольких циклов, но я думаю, что должно быть более разумное решение.

Чтобы объяснить это немного подробнее, вот пример:

const arr = [{
  id: 1,
  people: [
    {name: "x", surname: "x"},
    {name: "y", surname: "y"}
  ]
 },{
  id: 2,
  people: [
    {name: "a", surname: "a"},
    {name: "b", surname: "b"}
  ]
 }]

const result = [
 {id: 1, name: "x", surname: "x"},
 {id: 1, name: "y", surname: "y"},
 {id: 2, name: "a", surname: "a"},
 {id: 2, name: "b", surname: "b"}
]

Ответы [ 3 ]

2 голосов
/ 28 июня 2019

Используйте Array.flatMap() с внутренним Array.map(), чтобы добавить id:

const arr = [{"id":1,"people":[{"name":"x","surname":"x"},{"name":"y","surname":"y"}]},{"id":2,"people":[{"name":"a","surname":"a"},{"name":"b","surname":"b"}]}]
 
const result = arr.flatMap(({ id, people }) => people.map(p => ({ id, ...p })))

console.log(result)

Если Array.flatMap() не поддерживается вашими целевыми браузерами, используйте Array.map() и распространите в Array.concat():

const arr = [{"id":1,"people":[{"name":"x","surname":"x"},{"name":"y","surname":"y"}]},{"id":2,"people":[{"name":"a","surname":"a"},{"name":"b","surname":"b"}]}]
 
const result = [].concat(...arr.map(({ id, people }) => people.map(p => ({ id, ...p }))))

console.log(result)
1 голос
/ 28 июня 2019

Вы можете использовать array.reduce для создания нескольких записей для каждого people, предполагая, что массив никогда не меняет свою форму.Дальнейшие комментарии о том, как это работает, прямо в коде.

const arr = [{
  id: 1,
  people: [
    {name: "x", surname: "x"},
    {name: "y", surname: "y"}
  ]
 },{
  id: 2,
  people: [
    {name: "a", surname: "a"},
    {name: "b", surname: "b"}
  ]
 }]

// Reduce the origianal array.
const r = arr.reduce((acc, {id, people}) => {
  // For each people, push a new elemen to the array.
  return people.forEach(_people => {
    // the element pushed will hold the [id] and all the properties of the currently looped [people] item.
    acc.push(Object.assign({id}, _people));
  }), acc; // <-- finally, return the accumulator for the next iteration.
}, []); // <-- provide a new empty array as an initial value.
console.log(r);
1 голос
/ 28 июня 2019

Вы можете попробовать с map() и flat()

const arr = [{
  id: 1,
  people: [
    {name: "x", surname: "x"},
    {name: "y", surname: "y"}
  ]
 },{
  id: 2,
  people: [
    {name: "a", surname: "a"},
    {name: "b", surname: "b"}
  ]
 }]

const result = arr.map(p => {
  return p.people.map(pi => Object.assign(pi, {id: p.id}));
}).flat();
console.log(result);
...