Tengo esta matriz anidada de matriz de objetos:
const items = [ { id: 1, name: 'banana', selected: true, }, { id: 2, subItems: [ { id: '2a', name: 'apple', selected: true, }, { id: '2b', name: 'orange', selected: false, }, ], }, { id: 3, name: 'watermalon', selected: true, }, { id: 4, name: 'pear', selected: false, }, ] ¿Cómo puedo obtener la base de ids en la propiedad selected ?
Me las arreglé para obtener el primer nivel, lo he intentado
const selectedItemId = items.map(item => item.selected && item.id).filter(Boolean) pero, ¿cómo puedo seleccionar las identificaciones que están en los subelementos? Espero que el resultado sea [1, '2a', 3]
Aplane la matriz primero. Tenga cuidado al usar && item.id dentro del mapeador porque eso significará que se excluirán las identificaciones falsas (como 0, que es un número inicial razonable en algunos esquemas).
const items=[{id:1,name:"banana",selected:!0},{id:2,subItems:[{id:"2a",name:"apple",selected:!0},{id:"2b",name:"orange",selected:!1}]},{id:3,name:"watermalon",selected:!0},{id:4,name:"pear",selected:!1}]; const output = items .flatMap(item => [item].concat(item.subItems ?? [])) .filter(item => item.selected) .map(item => item.id); console.log(output);Puede recorrer recursivamente todos los elementos y seleccionar los elementos que se han selected establecidos en true .
const items = [ { id: 1, name: "banana", selected: true }, { id: 2, subItems: [ { id: "2a", name: "apple", selected: true }, { id: "2b", name: "orange", selected: false }, ], }, { id: 3, name: "watermalon", selected: true }, { id: 4, name: "pear", selected: false }, ]; function getSelectedItems(items, selectedItems = []) { for (let item of items) { if (item.subItems) { getSelectedItems(item.subItems, selectedItems); } else if (item.selected) { selectedItems.push(item.id); } } return selectedItems; } console.log(getSelectedItems(items)); let newArray = []; items.forEach(i=>{ if(i.selected){ newArray.push(i.id) } if(i.subItems){ i.subItems.forEach(j=>{ if(j.selected){ newArray.push(j.id) } }) } });así que esto es un poco largo. con 2 bucles de mapa