簡體   English   中英

使用 UnderscoreJS 從數組中刪除一個項目

[英]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 美分

使用可以像這樣使用普通 JavaScriptArray#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#reduceArray#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);

筆記:

  • 這兩種都是純函數方法(它們不修改現有數組)。
  • 不,這些方法需要外部庫(Vanilla JavaScript 就足夠了)。

我曾經嘗試過這種方法

_.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM