[英]Remove an item from array using UnderscoreJS
說我有這個代碼
var arr = [{id:1,name:'a'},{id:2,name:'b'},{id:3,name:'c'}];
我想從數組中刪除 id = 3 的項目。 有沒有辦法做到這一點而不拼接? Maye 使用下划線或類似的東西?
謝謝!
只需使用純 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 似乎沒有為此提供任何有用的功能。
您可以使用下划線.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; });
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
。
如果您正在過濾字符串並尋找不區分大小寫的過濾器,請小心。 _.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 美分
使用可以像這樣使用普通 JavaScript的Array#filter
方法:
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'}]
您可以使用下划線的拒絕方法,下面將返回一個新數組,該數組不會有特定匹配的數組
arr = _.reject(arr, function(objArr){ return objArr.id == 3; });
lodash可以使用:
_.compact(arr);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.