如果嵌套对象具有特定值,则从数组中删除对象

时间:2018-09-04 10:23:16

标签: javascript arrays json

我正在尝试从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));

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

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

1 个答案:

答案 0 :(得分: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;
});
相关问题