Usuń element z tablicy za pomocą UnderscoreJS


137

Powiedz, że mam ten kod

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

i chcę usunąć element o id = 3 z tablicy. Czy istnieje sposób na zrobienie tego bez łączenia? Czy możesz użyć podkreślenia lub czegoś takiego?

Dzięki!


Jeśli nie chcesz tworzyć nowej tablicy, jedynym wyborem jest splicing. Założę się, że podkreślenie też go używa (wewnętrznie, jeśli taka metoda istnieje).
Felix Kling

6
Co jest złego w splicingu?
Šime Vidas

Czy sprawdziłeś odniesienie do podkreślenia?
Šime Vidas

Po prostu używając zwykłego JavaScript, jest to duplikat usuwania obiektów z tablicy według właściwości obiektu .
Felix Kling

5
well nie jest duplikatem, ponieważ ma tag dla underscore.js
Garis M Suero

Odpowiedzi:


279

Po prostu używając zwykłego JavaScript, odpowiedź została już udzielona: usuń obiekty z tablicy według właściwości obiektu .

Używając underscore.js, możesz łączyć .findWherez .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>

Chociaż, ponieważ i tak tworzysz nową tablicę w tym przypadku, możesz po prostu użyć funkcji _.filternatywnej lub Array.prototype.filter(tak jak pokazano w drugim pytaniu). Wtedy wykonałbyś iterację po tablicy tylko raz, zamiast potencjalnie dwukrotnie, jak tutaj.

Jeśli chcesz zmodyfikować tablicę w miejscu , musisz użyć .splice. Jest to również pokazane w drugim pytaniu, a undescore nie wydaje się zapewniać żadnej użytecznej funkcji do tego.


1
Tak, to działa idealnie, przejrzałem dokumentację podkreślenia, ale nie do końca rozumiałem, jak to wyciągnąć bez. Dziękuję Ci!
climboid,

10
Czy metoda _.reject lub _.filter () nie byłaby tutaj bardziej wydajna? Skończyłbyś z dwiema iteracjami listy, aby wyciągnąć jedną pozycję.
Rick Strahl

1
To może być duplikat, ale to jest lepsza odpowiedź.
Michael J. Calkins

2
@RickStrahl Masz rację. _.rejectwygląda na lepszy wybór tutaj.
Tarik

1
@lukaserat, aby wyskoczyć ostatni element, użyj arr.pop()...
Emile Bergeron

96

Możesz użyć podkreślenia .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
    });

Można również zapisać jako:

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

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

Sprawdź Fiddle

Możesz także użyć .reject


Myślę, że miałeś na myśli: var filter = _.filter (arr, function (item) {return item.id! == 3});
tbh__

2
@tbh__ _()utworzy opakowanie wokół kolekcji, które pozwoli Ci wywołać metody podkreślenia.
Sushanth -

Używam podkreślenia od lat, nigdy o tym nie wiedziałem. Dzięki
tbh__


16

Underscore ma metodę _without () idealną do usuwania elementu z tablicy, zwłaszcza jeśli masz obiekt do usunięcia.

Zwraca kopię tablicy z usuniętymi wszystkimi wystąpieniami wartości.

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

=> ["bob", "fred"]

Działa również z bardziej złożonymi obiektami.

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

Jeśli nie masz elementu do usunięcia, tylko jego właściwość, możesz użyć _.findWherea następnie _.without.


2
Uwaga: działa to tylko dlatego, że przekazujesz ten sam obiekt bez. Jeśli zamiast tego przejdziesz { Name: "Sam", Age: 19 }do bez zmiennej sam, a nie do zmiennej sam, to już nie działa. Fiddle
Adam

5

Zachowaj ostrożność, jeśli filtrujesz ciągi znaków i szukasz filtrów niewrażliwych na wielkość liter. _.without () rozróżnia wielkość liter. Możesz także użyć _.reject (), jak pokazano poniżej.

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

Inne odpowiedzi tworzą nową kopię tablicy, jeśli chcesz zmodyfikować tablicę w miejscu, możesz użyć:

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

Ale zakłada się, że element zawsze będzie znajdował się wewnątrz tablicy (ponieważ jeśli nie zostanie znaleziony, nadal usunie ostatni element). Dla bezpieczeństwa możesz użyć:

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

2

lub w inny wygodny sposób:

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

moje 2 centy


1
pomiń działa objecti zwraca plik object. w związku z tym nie nadaje się do pracy z miejscami, w Arraysktórych możemy spodziewać się arrayzwrotu po usunięciu elementu.
ScrapCode

1
Tak więc _. Bez tego, na co patrzysz: _.without([1, 2, 1, 0, 3, 1, 4], 0, 1); => [2, 3, 4]
Nadeem,

2

Zastosowanie mogą korzystać Plain obsługa JavaScript dydaktycznego Array#filtermetodę tak:

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

Lub użyj Array#reducei Array#concatmetod takich jak ta:

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

UWAGA:

  • Oba są podejściem czysto funkcjonalnym ( tj . Nie modyfikują istniejącej tablicy).
  • Nie, w tym podejściu wymagana jest biblioteka zewnętrzna (wystarczy Vanilla JavaScript).

0

Kiedyś próbowałem tej metody

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

Mogą być też lepsze metody, takie jak powyższe rozwiązania dostarczane przez użytkowników


0

Używając 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);

Wynik będzie: [{id:1name:'a'},{id:2,name:'c'}]


-1

Możesz użyć odrzuconej metody Underscore, poniżej zwróci nową tablicę, która nie będzie miała tablicy z konkretnym dopasowaniem

arr = _.reject(arr, function(objArr){ return objArr.id == 3; });
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.