Entfernen Sie ein Element mit UnderscoreJS aus dem Array


137

Angenommen, ich habe diesen Code

var arr = [{id: 1, name: 'a'}, {id: 2, name: 'b'}, {id: 3, name: 'c'}];

und ich möchte das Element mit id = 3 aus dem Array entfernen. Gibt es eine Möglichkeit, dies ohne Spleißen zu tun? Maye etwas mit Unterstrich oder so etwas?

Vielen Dank!


Wenn Sie kein neues Array erstellen möchten, ist das Spleißen die einzige Wahl. Ich wette, der Unterstrich verwendet es auch (intern, wenn es eine solche Methode gibt).
Felix Kling

6
Was ist falsch am Spleißen?
Šime Vidas

Haben Sie die Referenz des Unterstrichs überprüft?
Šime Vidas

Bei Verwendung von einfachem JavaScript handelt es sich um ein Duplikat zum Entfernen von Objekten aus dem Array nach Objekteigenschaft .
Felix Kling

5
gut ist nicht doppelt, da es das Tag für underscore.js hat
Garis M Suero

Antworten:


279

Nur mit einfachem JavaScript wurde dies bereits beantwortet: Entfernen Sie Objekte aus dem Array nach Objekteigenschaft .

Mit Underscore.js, könnten Sie kombinieren .findWheremit .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>

Da Sie in diesem Fall ohnehin ein neues Array erstellen, können Sie einfach _.filterdie native Array.prototype.filterFunktion verwenden (wie in der anderen Frage gezeigt). Dann würden Sie das Array nur einmal anstatt möglicherweise zweimal wie hier durchlaufen.

Wenn Sie das Array ändern möchten an Ort und Stelle , müssen Sie verwenden .splice. Dies wird auch in der anderen Frage gezeigt und undescore scheint dafür keine nützliche Funktion zu bieten.


1
Ja, das funktioniert perfekt. Ich habe die Unterstrich-Dokumentation durchgesehen, aber nicht ganz verstanden, wie ich sie mit ohne herausziehen soll. Danke dir!
Climboid

10
Wäre _.reject oder _.filter () hier nicht viel effizienter? Sie würden am Ende zwei Iterationen der Liste haben, nur um ein Element herauszuholen.
Rick Strahl

1
Dies könnte ein Duplikat sein, aber dies ist die bessere Antwort.
Michael J. Calkins

2
@ RickStrahl Du hast recht. _.rejectsieht hier nach einer besseren Auswahl aus.
Tarik

1
@lukaserat, um das letzte Element arr.pop()
Emile Bergeron

96

Sie können Unterstrich verwenden .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
    });

Kann auch geschrieben werden als:

var filtered = arr.filter(function(item) {
    return item.id !== 3
});

var filtered = _.filter(arr, function(item) {
    return item.id !== 3
});

Überprüfen Sie die Geige

Sie können auch verwenden .reject


Ich denke du meintest: var gefiltert = _.filter (arr, function (item) {return item.id! == 3});
tbh__

2
@tbh__ _()erstellt einen Wrapper um die Sammlung, mit dem Sie Unterstrichmethoden aufrufen können.
Sushanth -

Ich benutze seit Jahren Unterstriche und habe das nie gewusst. Danke
tbh__


16

Unterstrich hat eine _without () -Methode, die sich perfekt zum Entfernen eines Elements aus einem Array eignet , insbesondere wenn Sie das zu entfernende Objekt haben.

Gibt eine Kopie des Arrays zurück, wobei alle Instanzen der Werte entfernt wurden.

_.without(["bob", "sam", "fred"], "sam");

=> ["bob", "fred"]

Funktioniert auch mit komplexeren Objekten.

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

Wenn Sie das zu entfernende Element nicht haben, können Sie nur eine Eigenschaft davon verwenden _.findWhereund dann _.without.


2
Hinweis: Dies funktioniert nur, weil Sie das sam-Objekt an without übergeben. Wenn Sie stattdessen { Name: "Sam", Age: 19 }ohne und nicht mit der Variablen sam übergeben, funktioniert dies nicht mehr. Geige
Adam

5

Bitte seien Sie vorsichtig, wenn Sie Zeichenfolgen filtern und nach Filtern suchen, bei denen die Groß- und Kleinschreibung nicht berücksichtigt wird. _.without () unterscheidet zwischen Groß- und Kleinschreibung. Sie können auch _.reject () wie unten gezeigt verwenden.

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

4

Andere Antworten erstellen eine neue Kopie des Arrays. Wenn Sie das Array an Ort und Stelle ändern möchten, können Sie Folgendes verwenden:

arr.splice(_.findIndex(arr, { id: 3 }), 1);

Dies setzt jedoch voraus, dass das Element immer im Array gefunden wird (denn wenn es nicht gefunden wird, wird das letzte Element trotzdem entfernt). Um sicher zu gehen, können Sie verwenden:

var index = _.findIndex(arr, { id: 3 });
if (index > -1) {
    arr.splice(index, 1);
}

2

oder ein anderer praktischer Weg:

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

meine 2 Cent


1
weglassen funktioniert weiter objectund gibt ein zurück object. Daher ist es nicht sehr gut, dort zu arbeiten, Arrayswo wir arraynach dem Entfernen eines Elements möglicherweise eine Rückendeckung erwarten .
ScrapCode

1
Also, _.ohne ist das , worauf Sie schauen: _.without([1, 2, 1, 0, 3, 1, 4], 0, 1); => [2, 3, 4]
Nadeem

2

Die Verwendung kann die einfache JavaScript - Array#filterMethode wie folgt verwenden:

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

Oder verwenden Array#reduceund Array#concatMethoden wie diese:

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

HINWEIS:

  • Beide sind rein funktionale Ansätze ( dh sie modifizieren das vorhandene Array nicht).
  • Nein, für diesen Ansatz ist eine externe Bibliothek erforderlich (Vanilla JavaScript ist ausreichend).

0

Ich habe diese Methode ausprobiert

_.filter(data, function(d) { return d.name != 'a' });

Möglicherweise gibt es auch bessere Methoden wie die oben genannten Lösungen, die von Benutzern bereitgestellt werden


0

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

Das Ergebnis ist :: [{id:1name:'a'},{id:2,name:'c'}]


-1

Sie können die Ablehnungsmethode von Underscore verwenden. Im Folgenden wird ein neues Array zurückgegeben, das kein Array mit einer bestimmten Übereinstimmung enthält

arr = _.reject(arr, function(objArr){ return objArr.id == 3; });
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.