Скажем, у меня есть этот код
var arr = [{id: 1, name: 'a'}, {id: 2, name: 'b'}, {id: 3, name: 'c'}];
и я хочу удалить элемент с id = 3 из массива. Есть ли способ сделать это без склейки? Может, что-то с подчеркиванием или что-то в этом роде?
Благодарность!
javascript
underscore.js
альпинистский
источник
источник
Ответы:
Просто используя простой JavaScript, на это уже был дан ответ: удалить объекты из массива по свойству объекта .
Используя underscore.js, вы можете сочетать
.findWhere
с.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>
Хотя, поскольку вы все равно создаете новый массив в этом случае, вы можете просто использовать
_.filter
или встроеннуюArray.prototype.filter
функцию (как показано в другом вопросе). Тогда вы будете перебирать массив только один раз, а не дважды, как здесь.Если вы хотите изменить массив на месте , вам нужно использовать
.splice
. Это также показано в другом вопросе, и undescore, похоже, не предоставляет для этого никакой полезной функции.источник
_.reject
похоже, здесь лучший выбор.arr.pop()
...Вы можете использовать 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 });
Также может быть записано как:
var filtered = arr.filter(function(item) { return item.id !== 3 }); var filtered = _.filter(arr, function(item) { return item.id !== 3 });
Проверить скрипку
Вы также можете использовать
.reject
источник
_()
создаст оболочку вокруг коллекции, которая позволит вам вызывать методы подчеркивания.Используйте подчеркивание
_.reject()
:arr = _.reject(arr, function(d){ return d.id === 3; });
источник
arr = _.reject(arr, d => d.id === 3 );
В Underscore есть метод _without (), идеально подходящий для удаления элемента из массива, особенно если у вас есть объект для удаления.
_.without(["bob", "sam", "fred"], "sam"); => ["bob", "fred"]
Также работает с более сложными объектами.
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 }];
Если у вас нет элемента для удаления, а только его свойство, вы можете использовать,
_.findWhere
а затем_.without
.источник
{ Name: "Sam", Age: 19 }
к без переменной, а не к переменной sam, она больше не будет работать. FiddleБудьте осторожны, если вы фильтруете строки и ищете фильтры без учета регистра. _.without () чувствителен к регистру. Вы также можете использовать _.reject (), как показано ниже.
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"]
источник
Другие ответы создают новую копию массива, если вы хотите изменить массив на месте, вы можете использовать:
arr.splice(_.findIndex(arr, { id: 3 }), 1);
Но это предполагает, что элемент всегда будет находиться внутри массива (потому что, если он не найден, он все равно удалит последний элемент). На всякий случай можно использовать:
var index = _.findIndex(arr, { id: 3 }); if (index > -1) { arr.splice(index, 1); }
источник
или другой удобный способ:
_.omit(arr, _.findWhere(arr, {id: 3}));
мои 2 цента
источник
object
и возвращаетobject
. следовательно, это не очень хорошо для работыArrays
там, где мы могли бы ожидатьarray
возврата после удаления элемента._.without([1, 2, 1, 0, 3, 1, 4], 0, 1); => [2, 3, 4]
Можно использовать простой
Array#filter
метод JavaScript , например: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);
Или использовать
Array#reduce
и такиеArray#concat
методы , как это: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);
НОТА:
источник
Я пробовал этот метод
_.filter(data, function(d) { return d.name != 'a' });
Могут быть и лучшие методы, такие как приведенные выше решения, предоставленные пользователями.
источник
Используя 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);
Результат будет:
[{id:1name:'a'},{id:2,name:'c'}]
источник
Вы можете использовать метод отклонения Underscore, ниже будет возвращен новый массив, в котором не будет массива с определенным соответствием
arr = _.reject(arr, function(objArr){ return objArr.id == 3; });
источник