通过json子数组过滤

时间:2019-02-05 13:23:00

标签: javascript arrays json

我在过滤JSON文件中的数组时遇到问题。

当我在主数组中使用filter时,它可以工作,但是我不能在子数组中做到这一点。

这是JSON文件:

[
    {
        "id": 1354,
        "name": "name",
        "type": "simple",
        "status": "ok",
        "categories": [
            {
                "id": 79,
                "name": "A",
            },
            {
                "id": 68,
                "name": "B",
            }
        ]
    },
    {
        "id": 1368,
        "name": "name",
        "type": "simple",
        "status": "ok",
        "categories": [
            {
                "id": 79,
                "name": "A",
            },
            {
                "id": 72,
                "name": "C",
            }
        ]
    },
    {...}
]

我正在使用此代码进行过滤,它可以按预期工作并返回带有status: 'ok'的项目:

return items.filter( item => {
    return item.status == 'ok';
});

我要存档的是退还具有category.name: 'B'的物品。

此代码似乎仅适用于第一个类别,并且如果该项目的第一个类别不是'B',则该项目不会显示:

return items.filter( item => {
    for (let category of item.categories) {
        return category.name == 'B';
    }
});

感谢任何想法

5 个答案:

答案 0 :(得分:1)

尝试改用Array.prototype.some()-仅当某些数组元素满足传递条件时,它才会返回true

const whole = [
    {
        "id": 1354,
        "name": "name",
        "type": "simple",
        "status": "ok",
        "categories": [
            {
                "id": 79,
                "name": "A",
            },
            {
                "id": 68,
                "name": "B",
            }
        ]
    },
    {
        "id": 1368,
        "name": "name",
        "type": "simple",
        "status": "ok",
        "categories": [
            {
                "id": 79,
                "name": "A",
            },
            {
                "id": 72,
                "name": "C",
            }
        ]
    },
    {
        "id": 1364,
        "name": "name",
        "type": "simple",
        "status": "ok",
        "categories": [
            {
                "id": 71,
                "name": "B",
            },
            {
                "id": 70,
                "name": "C",
            }
        ]
    },
]

const filtered = whole.filter(level_1 => {
  return level_1.categories.some(level_2 => level_2['name'] === 'B')
})

console.log(filtered);

答案 1 :(得分:0)

您在for循环中返回时间过早。您正在寻找的是some

const res = arr.filter(e => e.categories.some(({name}) => name === 'B'));
console.log(res);
<script>
const arr = [
    {
        "id": 1354,
        "name": "name",
        "type": "simple",
        "status": "ok",
        "categories": [
            {
                "id": 79,
                "name": "A",
            },
            {
                "id": 68,
                "name": "B",
            }
        ]
    },
    {
        "id": 1368,
        "name": "name",
        "type": "simple",
        "status": "ok",
        "categories": [
            {
                "id": 79,
                "name": "A",
            },
            {
                "id": 72,
                "name": "C",
            }
        ]
    },

]
</script>

答案 2 :(得分:0)

您可以执行以下操作:

  return items.filter( item => {
        return item.categories.findIndex(category => category.name === 'B') > -1
    });

答案 3 :(得分:0)

您已经在第一次类别检查后返回。如果类别名称与所需的模式不匹配,则应继续迭代,并且仅在所有迭代之后返回false。

return items.filter(item => {
    for (let category of item.categories) {
      if (category.name === 'B') {
        return true;
      }
    }
    return false;
});

答案 4 :(得分:-1)

仅在找到类别后才想返回

return items.filter( item => {
    for (let category of item.categories) {
        if (category.name === 'B') {
           return true
       }
    }
});

或使用Array.prototype.some的其他解决方案

return items.filter(item => {
    return item.categories.some(category => category.name === 'B');
});