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!

climboid
źródło
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.

Felix Kling
źródło
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

Sushanth -
źródło
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__
39

Użyj podkreślenia _.reject():

arr = _.reject(arr, function(d){ return d.id === 3; });
greenafrican
źródło
z ES6 możesz to zrobićarr = _.reject(arr, d => d.id === 3 );
greenafrican
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.

PeteGO
źródło
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"]
Srihari Sridharan
źródło
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);
}
Sajjad Shirazy
źródło
2

lub w inny wygodny sposób:

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

moje 2 centy

Nadeem
źródło
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).
Czarnobrody
źródło
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

Bastin Robin
źródło
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'}]

Anand Tamizh
źródło
-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; });
STAL
źródło