web-dev-qa-db-fra.com

Supprimer un élément d'un tableau en utilisant UnderscoreJS

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!

129
climboid

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.

260
Felix Kling

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

Vérifiez Fiddle

Vous pouvez également utiliser .reject

94
Sushanth --

Utilisez Underscore _.reject() :

arr = _.reject(arr, function(d){ return d.id === 3; });
37
greenafrican

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.

14
PeteGO

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"]
5

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);
}
3
Sajjad Shirazy

ou d'une autre manière pratique:

_.omit(arr, _.findWhere(arr, {id: 3}));

mes 2 cents

2
Nadeem

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: 

  • Les deux sont une approche fonctionnelle pure (i.e. ils ne modifient pas le tableau existant).
  • Non, une bibliothèque externe est requise dans cette approche (JavaScript vanille suffit).
1
BlackBeard

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

0
Bastin Robin

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'}]

0
Anand Tamizh