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!
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!
Odpowiedzi:
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ć .findWhere
z .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 _.filter
natywnej 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.
_.reject
wygląda na lepszy wybór tutaj.
arr.pop()
...
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
});
Możesz także użyć .reject
_()
utworzy opakowanie wokół kolekcji, które pozwoli Ci wywołać metody podkreślenia.
Użyj podkreślenia _.reject()
:
arr = _.reject(arr, function(d){ return d.id === 3; });
arr = _.reject(arr, d => d.id === 3 );
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ć _.findWhere
a następnie _.without
.
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"]
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);
}
lub w inny wygodny sposób:
_.omit(arr, _.findWhere(arr, {id: 3}));
moje 2 centy
object
i zwraca plik object
. w związku z tym nie nadaje się do pracy z miejscami, w Arrays
których możemy spodziewać się array
zwrotu po usunięciu elementu.
_.without([1, 2, 1, 0, 3, 1, 4], 0, 1); => [2, 3, 4]
Zastosowanie mogą korzystać Plain obsługa JavaScript dydaktycznego Array#filter
metodę 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#reduce
i Array#concat
metod 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:
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
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'}]