Как сгладить массив объектов, содержащих массивы? - PullRequest
1 голос
/ 02 мая 2019

Я хочу сгладить элементы массивом объектов и получить новый массив результатов.Как мне этого добиться?

Этот подход не сработал:

const group = [{
    idGroup: 1,
    member: [{
      name: "Tim"
    }, {
      name: "Sina"
    }]
  }],
}];

const result = [{
    idGroup: 1,
    name: "Tim"
  },
  {
    idGroup: 1,
    name: "Sina"
  },
]



const result = group.reduce((r, obj) => r.concat(obj.member), []);

console.log(result)

Ответы [ 5 ]

2 голосов
/ 02 мая 2019

Вы можете использовать flatMap() и map() для member массива объекта.

const group = [
 {
  idGroup:1,
  member: [{name: "Tim"}, {name: "Sina"}],
 }
];

const res = group.flatMap(x => x.member.map(a => ({...a,idGroup:x.idGroup})));
console.log(res)
2 голосов
/ 02 мая 2019

Вы можете отобразить вложенные объекты.

const
    group = [{ idGroup:1, member: [{ name: "Tim" }, { name: "Sina" }] }];
    result = group.reduce(
        (r, { idGroup, member }) => [...r, ...member.map(({ name }) => ({ idGroup, name }))],
        []
    );

console.log(result);

Или использовать предстоящий Array#flatMap.

const
    group = [{ idGroup:1, member: [{ name: "Tim" }, { name: "Sina" }] }];
    result = group.flatMap(({ idGroup, member }) =>
        member.map(({ name }) => ({ idGroup, name })));

console.log(result);
1 голос
/ 02 мая 2019

A старый добрый цикл тоже может работать.

const group =
[{
    idGroup: 1,
    member: [{
      name: "Tim"
    }, {
      name: "Sina"
    }]
},
{
    idGroup: 2,
    member: [{
      name: "foo"
    }, {
      name: "bar"
    }, {
      name: "42"
    }]
}];

let result = [];

group.forEach((elem) => {
  elem.member.forEach((subElem) => {
    result.push({ idGroup: elem.idGroup, name: subElem.name });
  });
});

console.log(result);
1 голос
/ 02 мая 2019

Вы можете использовать Array.prototype.reduce () и Array.prototype.forEach () следующим образом:

const group = [{
  idGroup: 1,
  member: [{name: "Tim"}, {name: "Sina"}],
}, {
  idGroup: 2,
  member: [{name: "Jo"}, {name: "Eric"}]
}];

const result = group.reduce((acc, { idGroup, member }) => {
  member.forEach(({ name }) => acc.push({ idGroup, name }));
  return acc;
}, []);

console.log(result);
1 голос
/ 02 мая 2019

Вам также понадобится использовать map (для создания новых предметов):

const group = [{idGroup:1,member:[{name: "Tim"},{name: "Sina"}]}];
const result = group.reduce((acc, { idGroup, member }) => acc.concat(member.map(({ ...props }) => ({ ...props, idGroup }), [])), []);
console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...