Dis que j'ai ce code
var arr = [{id: 1, nom: 'a'}, {id: 2, nom: 'b'}, {id: 3, nom: 'c'}];
et je veux supprimer l'élément avec id = 3 du tableau. Y a-t-il un moyen de faire cela sans épissage? Quelque chose utilise un trait de soulignement ou quelque chose comme ça?
Merci!
En utilisant simplement du javascript, nous avons déjà répondu à cette question: supprime les objets d'un tableau par la propriété de l'objet .
En utilisant underscore.js, vous pouvez combiner .findWhere
avec .without
:
var arr = [{
id: 1,
name: 'a'
}, {
id: 2,
name: 'b'
}, {
id: 3,
name: 'c'
}];
//substract third
arr = _.without(arr, _.findWhere(arr, {
id: 3
}));
console.log(arr);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
Cependant, étant donné que vous créez un nouveau tableau dans ce cas, vous pouvez simplement utiliser _.filter
ou la fonction native Array.prototype.filter
(comme dans l’autre question). Ensuite, il vous suffira d’itérer sur le tableau une fois au lieu de potentiellement deux fois comme ici.
Si vous souhaitez modifier le tableau in-place, vous devez utiliser .splice
. Ceci est également montré dans l'autre question et undescore ne semble pas fournir de fonction utile pour cela.
Vous pouvez utiliser Underscore .filter
var arr = [{
id: 1,
name: 'a'
}, {
id: 2,
name: 'b'
}, {
id: 3,
name: 'c'
}];
var filtered = _(arr).filter(function(item) {
return item.id !== 3
});
Peut aussi être écrit comme:
var filtered = arr.filter(function(item) {
return item.id !== 3
});
var filtered = _.filter(arr, function(item) {
return item.id !== 3
});
Vous pouvez également utiliser .reject
Utilisez Underscore _.reject()
:
arr = _.reject(arr, function(d){ return d.id === 3; });
Le soulignement a une méthode _without () idéale pour supprimer un élément d'un tableau, surtout si vous avez l'objet à supprimer.
Retourne une copie du tableau avec toutes les occurrences des valeurs supprimées.
_.without(["bob", "sam", "fred"], "sam");
=> ["bob", "fred"]
Fonctionne aussi avec des objets plus complexes.
var bob = { Name: "Bob", Age: 35 };
var sam = { Name: "Sam", Age: 19 };
var fred = { Name: "Fred", Age: 50 };
var people = [bob, sam, fred]
_.without(people, sam);
=> [{ Name: "Bob", Age: 35 }, { Name: "Fred", Age: 50 }];
Si vous n'avez pas l'élément à supprimer, mais seulement une propriété de celui-ci, vous pouvez utiliser _.findWhere
puis _.without
.
Faites attention si vous filtrez des chaînes et recherchez des filtres insensibles à la casse. _.without () est sensible à la casse. Vous pouvez également utiliser _.reject () comme indiqué ci-dessous.
var arr = ["test","test1","test2"];
var filtered = _.filter(arr, function(arrItem) {
return arrItem.toLowerCase() !== "TEST".toLowerCase();
});
console.log(filtered);
// ["test1", "test2"]
var filtered1 = _.without(arr,"TEST");
console.log(filtered1);
// ["test", "test1", "test2"]
var filtered2 = _.reject(arr, function(arrItem){
return arrItem.toLowerCase() === "TEST".toLowerCase();
});
console.log(filtered2);
// ["test1", "test2"]
D'autres réponses créent une nouvelle copie du tableau. Si vous souhaitez modifier le tableau à la place, vous pouvez utiliser:
arr.splice(_.findIndex(arr, { id: 3 }), 1);
Mais cela suppose que l'élément sera toujours trouvé dans le tableau (car s'il n'est pas trouvé, il supprimera toujours le dernier élément). Pour être en sécurité, vous pouvez utiliser:
var index = _.findIndex(arr, { id: 3 });
if (index > -1) {
arr.splice(index, 1);
}
ou d'une autre manière pratique:
_.omit(arr, _.findWhere(arr, {id: 3}));
mes 2 cents
Use peut utiliser plain JavaScript/ Array#filter
comme ceci:
var arr = [{id:1,name:'a'},{id:2,name:'b'},{id:3,name:'c'}];
var filteredArr = arr.filter(obj => obj.id != 3);
console.log(filteredArr);
Ou bien, utilisez Array#reduce
et Array#concat
des méthodes comme celle-ci:
var arr = [{id:1,name:'a'},{id:2,name:'b'},{id:3,name:'c'}];
var reducedArr = arr.reduce((accumulator, currObj) => {
return (currObj.id != 3) ? accumulator.concat(currObj) : accumulator;
}, []);
console.log(reducedArr);
REMARQUE:
J'avais l'habitude d'essayer cette méthode
_.filter(data, function(d) { return d.name != 'a' });
Il pourrait également y avoir de meilleures méthodes que les solutions ci-dessus proposées par les utilisateurs
En utilisant underscore.js
var arr = [{id:1,name:'a'},{id:2,name:'b'},{id:3,name:'c'}];
var resultArr = _.reject(arr,{id:3});
console.log(resultArr);
Le résultat sera :: [{id:1name:'a'},{id:2,name:'c'}]