3
votes

Lodash: Comment supprimer un élément ou un élément imbriqué du tableau en utilisant un identifiant?

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?


0 commentaires

3 Réponses :


-1
votes

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);


1 commentaires

Cela ne fonctionne pas pour la structure imbriquée, par exemple, vous s4p58o ne peut pas être supprimé avec votre solution.



-1
votes

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"))


0 commentaires

4
votes

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);


0 commentaires