【问题标题】:Remove object from array if nested object has certain value如果嵌套对象具有特定值,则从数组中删除对象
【发布时间】:2019-02-09 08:34:06
【问题描述】:

我正在尝试从 json 对象返回一个数组。 每个对象都有一些数据和另一个嵌套数组/对象

像这样:

{
    "data": [
        {
            "name": "name",
            "id": "id",
            "amount": 4000,
            "items": [
                {
                    "number": 12,
                    "isAvailable": true,
                },
                {
                    "number": 15,
                    "isAvailable": true,
                },
                {
                    "number": 16,
                    "isAvailable": true,
                },
                {
                    "number": 17,
                    "isAvailable": true,
                }
            ]
        },
        {
            "name": "name2",
            "id": "id2",
            "amount": 3000,
            "items": [
                {
                    "number": 12,
                    "isAvailable": true,
                },
                {
                    "number": 15,
                    "isAvailable": true,
                },
                {
                    "number": 16,
                    "isAvailable": false,
                },
                {
                    "number": 17,
                    "isAvailable": true,
                }
            ]
        },
        {
            "name": "name4",
            "id": "id4",
            "amount": 1200,
            "items": [
                {
                    "number": 12,
                    "isAvailable": true,
                },
                {
                    "number": 15,
                    "isAvailable": true,
                },
                {
                    "number": 16,
                    "isAvailable": true,
                },
                {
                    "number": 17,
                    "isAvailable": true,
                }
            ]
        }
    ]
 }

我想检查所有对象,看看这些对象中是否有包含"isAvailable": false 的项目 如果一个项目不可用,我需要从数组中删除父对象(所以不是项目数组,而是上面的完整对象。

然后我想返回这个对象被移除的数组。

我通过使用 ES6 findIndex 来实现这一点

array.findIndex(object => object.items.some(item => !item.isAvailable));

这将返回拥有它的父数组的索引,我可以使用它来拼接数组。但这仅适用于单个对象。如果我有另一个对象,它仍然会返回第一个索引。

如何根据条件检查是否存在多个对象并将它们从数组中删除?

【问题讨论】:

  • 您的对象语法无效,一些数字后面有引号:"number": 12"
  • 使用.filter 而不是.findIndex
  • @LucaKiebel 哎呀,这是一个用户错误。这是虚拟数据 :) 感谢您的关注

标签: javascript arrays json


【解决方案1】:

您可以使用.filter 而不是.findIndex,然后将数组重新分配给新的过滤数组:

const removed = data.filter(object => object.items.some(item => !item.isAvailable));
data = data.filter(item => !removed.includes(item));

如果您需要变异而不仅仅是重新分配,您可以在过滤时splice

const removed = data.filter(object => {
  const toRemove = object.items.some(item => !item.isAvailable);
  if (!toRemove) return false;
  // Have to use `indexOf` rather than the second filter argument
  // because the index of the object might change due to an earlier splice:
  data.splice(data.indexOf(object), 1);
  return true;
});

【讨论】:

  • 啊!重新分配是我错过的。我试图做过滤而不是 findIndex 但它没有用。现在我知道为什么了!谢谢!
猜你喜欢
  • 2019-11-02
  • 1970-01-01
  • 2019-03-29
  • 2020-07-20
  • 2020-12-07
  • 2021-12-28
  • 2020-08-28
  • 2020-06-12
  • 1970-01-01
相关资源
最近更新 更多