J'ai un tableau qui ressemble à ce qui suit:
_.remove(this.items, function(item) { return item.id !== id; });
Ce que j'essaie de faire est de supprimer un élément du tableau ou d'un tableau imbriqué en utilisant un identifiant fourni.
par exemple si denuzi
est fourni alors le premier objet entier est supprimé; si s4p58o
est fourni, seul cet objet du premier sous-tableau d'objets est supprimé.
Je sais que je peux supprimer un objet entier avec le code suivant:
[ { "id": "denuzi", "sub": [ {"id": "s4p58o"}, {"id": "xzbqi"}, ], }, { "id": "4rcodm", "sub": [], } ]
Mais je ne sais pas comment faire une vérification pour supprimer un sous-élément?
3 Réponses :
Utilisez simplement Array.prototype.filter
var list = [ { "id": "denuzi", "sub": [ {"id": "s4p58o"}, {"id": "xzbqi"}, ], }, { "id": "4rcodm", "sub": [], } ] const result = list.filter(a => a.id !== 'denuzi'); console.log(result);
Cela ne fonctionne pas pour la structure imbriquée, par exemple, vous s4p58o
ne peut pas être supprimé avec votre solution.
Sans utiliser lodash
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
Avec lodash
const data = [ { "id": "denuzi", "sub": [ {"id": "s4p58o"}, {"id": "xzbqi"}, ], }, { "id": "4rcodm", "sub": [], } ] function remove(data, removeId){ return _.remove(data, (item) => item.id !== removeId) // removes parent object if its id matches removeId .map(({id, sub}) => ({id, sub: _.remove(sub, (item) => item.id !== removeId)})) // replaces sub array with new sub array with subobject missing } // i parse data to do a deep copy for showing the property console.log(remove(JSON.parse(JSON.stringify(data)), "s4p58o")); console.log(remove(JSON.parse(JSON.stringify(data)), "denuzi"))
let data = [ { "id": "denuzi", "sub": [ {"id": "s4p58o"}, {"id": "xzbqi"}, ], }, { "id": "4rcodm", "sub": [], } ] function remove(data, removeId){ return data .filter(({id}) => id!==removeId) // removes parent object if its id matches removeId .map(({id, sub}) => ({id, sub: sub.filter(({id}) => id!==removeId)})) // replaces sub array with new sub array with subobject missing } console.log(remove(data, "s4p58o")); console.log(remove(data, "denuzi"))
Vous pouvez adopter une approche itérative et récursive en vérifiant l ' id
ou appeler à nouveau pour sub
. Quitter si trouvé.
.as-console-wrapper { max-height: 100% !important; top: 0; }
function remove(array, id) { return array.some((o, i, a) => o.id === id ? a.splice(i, 1) : remove(o.sub || [], id) ); } var array = [{ id: "denuzi", sub: [{ id: "s4p58o" }, { id: "xzbqi" }] }, { id: "4rcodm", sub: [] }]; remove(array, 's4p58o'); console.log(array); remove(array, 'denuzi'); console.log(array);