Скажіть, у мене є цей код
var arr = [{id: 1, name: 'a'}, {id: 2, name: 'b'}, {id: 3, name: 'c'}];
і я хочу видалити елемент з id = 3 з масиву. Чи існує спосіб зробити це без сплайсингу? Має щось, використовуючи підкреслення чи щось подібне?
Дякую!
Скажіть, у мене є цей код
var arr = [{id: 1, name: 'a'}, {id: 2, name: 'b'}, {id: 3, name: 'c'}];
і я хочу видалити елемент з id = 3 з масиву. Чи існує спосіб зробити це без сплайсингу? Має щось, використовуючи підкреслення чи щось подібне?
Дякую!
Відповіді:
Лише використовуючи звичайний 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
. Це також показано в іншому запитанні, і, мабуть, невизначеність не дає корисної функції для цього.
_.reject
Тут виглядає кращий вибір.
arr.pop()
...
Ви можете використовувати підкреслення .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 );
Підкреслення має метод _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
.
Будьте уважні, якщо ви фільтруєте струни та шукаєте нечутливі до регістру фільтри. _.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'}]