tengo una matriz asi
let items = [ {name: "1"}, {name: "2"}, {name: "3"}, {unwrap: true, items: [ {name: "4"}, {name: "5"}, {name: "6"}, ] }, {name: "7"}, ]¿Cómo puedo aplanar el objeto desenvuelto para obtener el siguiente resultado?
items = [ {name: "1"}, {name: "2"}, {name: "3"}, {name: "4"}, {name: "5"}, {name: "6"}, {name: "7"}, ]Pensé que podría hacer algo como esto:
items.map(item => { if(item.hasOwnProperty("unwrap")){ return ... item.items } return item }) Sin embargo, los ... s no funcionan como valor de retorno.
Se me ocurrió algo torpe usando una segunda matriz así:
let output = [] items.forEach((item) => { if (!item) { return; } if (item.hasOwnProperty("unwrap")) { return output.push(...item.contents); } return output.push(item); });Puedes confiar en flatMap :
items.flatMap((x) => { if (!x.unwrap) { return x; } return x.items; });flatMap es lo que necesitas.
const items=[{name:"1"},{name:"2"},{name:"3"},{unwrap:!0,items:[{name:"4"},{name:"5"},{name:"6"}]},{name:"7"}]; const result = items.flatMap(item => { if (item.hasOwnProperty('unwrap')) { return item.items; } return item; }); console.log(result);Otra forma de usar reduce()
let items = [{name: "1"}, {name: "2"}, {name: "3"}, {unwrap: true, items: [{name: "4"}, {name: "5"}, {name: "6"}, ] }, {name: "7"}, ]; const res = items.reduce((p, c) => p.concat(c.items || c), []); console.log(res); Dado que obj.items no existirá en los objetos regulares, podemos usar el || operador para obtener los elementos deseados, luego concat a la matriz final.