簡體   English   中英

根據對象屬性刪除數組元素

[英]Remove array element based on object property

我有一個像這樣的對象數組:

var myArray = [
    {field: 'id', operator: 'eq', value: id}, 
    {field: 'cStatus', operator: 'eq', value: cStatus}, 
    {field: 'money', operator: 'eq', value: money}
];

如何根據其屬性刪除特定的?

例如,我將如何刪除以 'money' 作為字段屬性的數組對象?

一種可能:

myArray = myArray.filter(function( obj ) {
    return obj.field !== 'money';
});

請注意filter會創建一個新數組。 盡管您使用新引用更新了原始變量myArray ,但引用原始數組的任何其他變量都不會獲得過濾后的數據。 謹慎使用。

遍歷數組, splice出你不想要的。 為了更容易使用,向后迭代,這樣您就不必考慮數組的實時性質:

for (var i = myArray.length - 1; i >= 0; --i) {
    if (myArray[i].field == "money") {
        myArray.splice(i,1);
    }
}

假設您想通過它的 field 屬性刪除第二個對象。

使用 ES6 就這么簡單。

myArray.splice(myArray.findIndex(item => item.field === "cStatus"), 1)

在 ES6 中,只有一行。

const arr = arr.filter(item => item.key !== "some value");

:)

可以使用 lodash 的findIndex獲取特定元素的索引,然后拼接使用。

myArray.splice(_.findIndex(myArray, function(item) {
    return item.value === 'money';
}), 1);

更新

你也可以使用 ES6 的findIndex()

findIndex() 方法返回數組中滿足提供的測試函數的第一個元素的索引。 否則返回-1。

const itemToRemoveIndex = myArray.findIndex(function(item) {
  return item.field === 'money';
});

// proceed to remove an item only if it exists.
if(itemToRemoveIndex !== -1){
  myArray.splice(itemToRemoveIndex, 1);
}

這是使用 jQuery grep 的另一個選項。 true作為第三個參數傳遞以確保 grep 刪除與您的函數匹配的項目。

users = $.grep(users, function(el, idx) {return el.field == "money"}, true)

如果您已經在使用 jQuery,則不需要 shim,這可能比使用Array.filter有用。

我們可以使用以下 2 種方法根據屬性刪除元素。

  1. 使用過濾方法
testArray.filter(prop => prop.key !== 'Test Value')
  1. 采用拼接法。 對於這種方法,我們需要找到屬性的索引。
 const index = testArray.findIndex(prop => prop.key === 'Test Value') testArray.splice(index,1)
var myArray = [
    {field: 'id', operator: 'eq', value: id}, 
    {field: 'cStatus', operator: 'eq', value: cStatus}, 
    {field: 'money', operator: 'eq', value: money}
];
console.log(myArray.length); //3
myArray = $.grep(myArray, function(element, index){return element.field == "money"}, true);
console.log(myArray.length); //2

元素是數組中的一個對象。 第三個參數true表示將返回一個使函數邏輯失敗的元素數組, false表示將返回一個使函數邏輯失敗的元素數組。

使用lodash庫:

 var myArray = [ {field: 'id', operator: 'eq', value: 'id'}, {field: 'cStatus', operator: 'eq', value: 'cStatus'}, {field: 'money', operator: 'eq', value: 'money'} ]; var newArray = _.remove(myArray, function(n) { return n.value === 'money';; }); console.log('Array'); console.log(myArray); console.log('New Array'); console.log(newArray);
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.js"></script>

基於上面的一些評論,下面是如何根據鍵名和鍵值刪除對象的代碼

 var items = [ 
  { "id": 3.1, "name": "test 3.1"}, 
  { "id": 22, "name": "test 3.1" }, 
  { "id": 23, "name": "changed test 23" } 
  ]

    function removeByKey(array, params){
      array.some(function(item, index) {
        return (array[index][params.key] === params.value) ? !!(array.splice(index, 1)) : false;
      });
      return array;
    }

    var removed = removeByKey(items, {
      key: 'id',
      value: 23
    });

    console.log(removed);

jAndy 的解決方案可能是最好的,但如果您不能依賴過濾器,您可以執行以下操作:

var myArray = [
    {field: 'id', operator: 'eq', value: 'id'}, 
    {field: 'cStatus', operator: 'eq', value: 'cStatus'}, 
    {field: 'money', operator: 'eq', value: "money"}
];

myArray.remove_key = function(key){
    var i = 0, 
        keyval = null;
    for( ; i < this.length; i++){
        if(this[i].field == key){
            keyval = this.splice(i, 1);
            break;
        }
    }
    return keyval;
}

如果您不使用 jQuery,以下是代碼。 演示

var myArray = [
    {field: 'id', operator: 'eq', value: 'id'}, 
    {field: 'cStatus', operator: 'eq', value: 'cStatus'}, 
    {field: 'money', operator: 'eq', value: 'money'}
];

alert(myArray.length);

for(var i=0 ; i<myArray.length; i++)
{
    if(myArray[i].value=='money')
        myArray.splice(i);
}

alert(myArray.length);

您還可以使用具有很多功能的下划線庫。

Underscore是一個實用的 JavaScript 庫,它提供了大量的函數式編程支持

使用 lodash 庫很簡單

_.remove(myArray , { field: 'money' });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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