Одним из возможных решений является объединение Array.reduce () с Object.entries и для каждой записи текущего проверенного object
, проверьте тип, чтобы решить, как поместитьэлемент в новом массиве:
let array = [
{
name: "name01",
surname: "surname01",
arr: [{name: "inner01"}, {name: "inner02"}, {name: "inner03"}]
},
{
name: "name02",
surname: "surname02",
arr: [{name: "inner04"}, {name: "inner05"}, {name: "inner06"}]
}
];
let res = array.reduce((acc, curr) =>
{
Object.entries(curr).forEach(([k, v]) =>
{
if (typeof v === 'string')
acc.push({[k]: v});
else if (Array.isArray(v))
acc.push(...v);
});
return acc;
}, []);
console.log(res);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
Обратите внимание, предыдущее, вероятно, является общим решением, однако, если вы можете доверять структуре ваших объектов, т. Е. Все они имеют name
свойство с string
и array
на свойстве arr
, тогда код можно упростить:
let array = [
{
name: "name01",
arr: [{name: "inner01"}, {name: "inner02"}, {name: "inner03"}]
},
{
name: "name02",
arr: [{name: "inner04"}, {name: "inner05"}, {name: "inner06"}]
}
];
let res = array.reduce(
(acc, {name, arr}) => acc.concat([{name}, ...arr]),
[]
);
console.log(res);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}