Javascript 使用过滤器过滤对象

Javascript 使用过滤器过滤对象,javascript,arrays,filter,ecmascript-6,Javascript,Arrays,Filter,Ecmascript 6,我有如下对象数组: pages= [ { "id":1, "name":"name1", "languages":[ { "id":1, "lang":"en" }, { "id":2, "lang":"de" } ] }, { "id":2,

我有如下对象数组:

pages= [
   {
      "id":1,
      "name":"name1",
      "languages":[
         {
            "id":1,
            "lang":"en"
         },
         {
            "id":2,
            "lang":"de"
         }
      ]
   },
   {
      "id":2,
      "name":"name2",
      "languages":[
         {
            "id":1,
            "lang":"en"
         },
         {
            "id":2,
            "lang":"de"
         }
      ]
   },
   {
      "id":3,
      "name":"name3",
      "languages":[
         {
            "id":1,
            "lang":"en"
         }
      ]
   }
]
语言数组(将通过单击复选框进行设置)如下所示:

selectedLanguages=['en'];
现在,我想根据
selectedLanguages
值过滤主数组。我已尝试使用以下代码:

pages.filter(page => {
    var present = false;
    page.languages.map(l => {
        if(selectedLanguages.includes(l.lang)) {
            present = true;
        }
    });
    if(present) {
        return page;
    }
})
所需输出:如果
selectedLanguages=['en']
则为
页面中的所有项目,如果
de
则为前两个元素

它是有效的,但我很好奇我是否能做得更好


任何建议都会很有帮助:)谢谢。

您可以使用和的组合:

let pages=[
{
“id”:1,
“名称”:“名称1”,
“语言”:[
{
“id”:1,
“郎”:“恩”
},
{
“id”:2,
“郎”:“德”
}
]
},
{
“id”:2,
“名称”:“名称2”,
“语言”:[
{
“id”:1,
“郎”:“恩”
},
{
“id”:2,
“lang”:“fr”
}
]
}
]
让selectedLanguages=['fr'];
让result=pages.filter(e=>e.languages.find(l=>selectedLanguages.includes(l.lang));

控制台日志(结果)
与其尝试使用
.map
创建中间数组,不如简单地检查
某些
语言
是否包含与
所选语言
匹配的
语言

constpages=[{“id”:1,“name”:“name1”,“languages”:[{“id”:1,“lang”:“en”},{“id”:2,“lang”:“de”},{“id”:2,“name”:“name2”,“languages”:[{“id”:1,“lang”:“en”},{“id”:2,“lang”:“de”}]
const selectedLanguages=['en'];
console.log(
pages.filter(({languages})=>(
languages.some({lang})=>selectedLanguages.includes(lang))
))
)
您可以使用
filter()
indexOf()
检查
所选语言的数组:

var页面=[
{
“id”:1,
“名称”:“名称1”,
“语言”:[
{
“id”:1,
“郎”:“恩”
},
{
“id”:2,
“郎”:“德”
}
]
},
{
“id”:2,
“名称”:“名称2”,
“语言”:[
{
“id”:1,
“郎”:“恩”
},
{
“id”:2,
“郎”:“德”
}
]
},
{
“id”:3,
“名称”:“名称3”,
“语言”:[
{
“id”:5,
“郎”:“我们”
},
{
“id”:6,
“郎”:“德”
}
]
}
];
var selectedLanguages=['en'];
var res=pages.filter((页面)=>{
var languageFound=page.languages.find(language=>selectedLanguages.indexOf(language.lang)!=-1);
如果(找到语言){
返回页面;
}
});

控制台日志(res)请加上想要的结果。我想这就是你所说的,因为你的例子已经对我有用了。。。只需将
页面的输出分配给另一个变量就可以了。filter(…)
我已经提到过它是有效的:)我希望它是更好或更紧凑的解决方案。