【问题标题】:Remove all objects from array with a specific key value从具有特定键值的数组中删除所有对象
【发布时间】:2018-09-26 12:14:26
【问题描述】:

我一直在苦苦挣扎一天,一整天都在搜索整个 stackoverflow 和谷歌以尝试解决这个问题,但我很绝望。 我已经尝试了几十种解决方案,但似乎都没有奏效......

我有一个对象数组,其中每个对象都有一个名为 pid 且具有特定值的键。 现在我想删除所有具有相同的特定 pid 值的对象。

我试过了 forEach, filter, $.each, $.grep 和许多其他函数试图解决这个问题,但都失败了(或者我每次都做错了什么?)

简单地说,我想删除每个具有特定 pid 值的对象。我当前的代码是:

$.each(cart, function(i){
        if(cart[i].pid === pid){
            cart.splice(i,1);
        }
    });

但是这个一直抛出:Cannot read property pid of undefined

其他函数仅删除(随机?)数量的对象,数组中仍有一些剩余的具有不需要的 pid 值。

我不一定要坚持使用$.each 函数,因此非常感谢任何解决方案。

对象数组:

[{"id":1523898500862,"amm":1,"type":"t","name":"bluecheese","pid":1523898494726,"cost":0.5},{"id":1523898501937,"amm":1,"type":"t","name":"edam","pid":1523898494726,"cost":0.5},{"id":1523898505766,"amm":1,"type":"t","name":"mozzarella","pid":1523898494726,"cost":1}]

您可以看到所有三个对象都具有相同的 pid 值,我想根据那个 pid

将它们全部删除

【问题讨论】:

标签: javascript arrays object each splice


【解决方案1】:

filter() 是您的解决方案。它将回调作为参数,决定是否应将元素保留在数组中并返回过滤后的数组。

function remove(arr, pid) {
  return arr.filter(e => e.pid !== pid);
}

let arr = [{ pid: 1 }, { pid: 2 }];
console.log("Removed pid:1", remove(arr, 1));
console.log("Removed pid:2", remove(arr, 2));
console.log("Removed pid:3", remove(arr, 3));

let yourArr = [{
  "id": 1523898500862,
  "amm": 1,
  "type": "t",
  "name": "bluecheese",
  "pid": 1523898494726,
  "cost": 0.5
}, {
  "id": 1523898501937,
  "amm": 1,
  "type": "t",
  "name": "edam",
  "pid": 1523898494726,
  "cost": 0.5
}, {
  "id": 1523898505766,
  "amm": 1,
  "type": "t",
  "name": "mozzarella",
  "pid": 1523898494726,
  "cost": 1
}];
console.log("Removed from your array", remove(yourArr, 1523898494726));

【讨论】:

  • 这显然行不通,因为它只删除了数组中的一个实例
  • 这很奇怪。
  • 我知道。我现在想通了。谢谢
  • 我学到的重要一点是过滤器已经是一个循环。它将遍历整个数组并删除与这种情况匹配的任何内容。我之前在数组中的 for 循环中使用了我的过滤器。那没用,这个解决方案对我有用。
【解决方案2】:

这是一种简单的方法,可以避免在迭代时修改和在良好的旧 O(n) 中良好运行的任何困难:

var removeByPid = function(cart, pid) {
  var result = [];
  for (var i = 0, len = cart.length; i < len; i++)
    if (cart[i].pid !== pid) result.push(cart);
  return result;
};

现在你可以说:

var cart = /* ... get values for cart somehow ...  */

// ... Do more stuff ...

cart = removeByPid(cart, 1234);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-28
    • 2010-09-18
    • 1970-01-01
    • 2016-07-13
    • 2017-11-05
    • 1970-01-01
    相关资源
    最近更新 更多