Javascript 过滤json子数组

Javascript 过滤json子数组,javascript,arrays,json,Javascript,Arrays,Json,我在JSON文件中过滤数组时遇到问题 当我在主阵列中使用过滤器时,它可以工作,但在子阵列中我不能这样做 这是JSON文件: [ { "id": 1354, "name": "name", "type": "simple", "status": "ok", "categories": [ { "id": 79, "name"

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

当我在主阵列中使用
过滤器时,它可以工作,但在子阵列中我不能这样做

这是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",
            }
        ]
    },
    {...}
]
我正在使用此代码进行筛选,它按预期工作,并返回状态为“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';
    }
});

感谢您的任何想法

您在
for
循环中返回得太早了。您需要的是:

const res=arr.filter(e=>e.categories.some({name}=>name==B');
控制台日志(res)

常数arr=[
{
“id”:1354,
“名称”:“名称”,
“类型”:“简单”,
“状态”:“确定”,
“类别”:[
{
“id”:79,
“姓名”:“A”,
},
{
“id”:68,
“名称”:“B”,
}
]
},
{
“id”:1368,
“名称”:“名称”,
“类型”:“简单”,
“状态”:“确定”,
“类别”:[
{
“id”:79,
“姓名”:“A”,
},
{
“id”:72,
“姓名”:“C”,
}
]
},
]

您可以执行以下操作:

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

尝试改用
Array.prototype.some()
——只有当一些数组元素满足传递的条件时,它才会返回
true

常量整=[
{
“id”:1354,
“名称”:“名称”,
“类型”:“简单”,
“状态”:“确定”,
“类别”:[
{
“id”:79,
“姓名”:“A”,
},
{
“id”:68,
“名称”:“B”,
}
]
},
{
“id”:1368,
“名称”:“名称”,
“类型”:“简单”,
“状态”:“确定”,
“类别”:[
{
“id”:79,
“姓名”:“A”,
},
{
“id”:72,
“姓名”:“C”,
}
]
},
{
“id”:1364,
“名称”:“名称”,
“类型”:“简单”,
“状态”:“确定”,
“类别”:[
{
“id”:71,
“名称”:“B”,
},
{
“id”:70,
“姓名”:“C”,
}
]
},
]
const filtered=整个过滤器(级别1=>{
返回级别1.类别。一些(级别2=>级别2['name']=='B')
})

console.log(过滤)您在第一次类别检查后立即返回。若类别名称与所需模式不匹配,则应继续迭代,并仅在所有迭代后返回false

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