繁体   English   中英

基于多个条件的javascript对象过滤器

[英]javascript object filter based on multiple conditions

我有以下对象,我想根据某些属性对其进行过滤,仅输出其中的某些部分。

{
    "email" : "john.doe@acme.com",
    "name" : " John Doe",
    "groups" : [
        {
            "name" : "group1",
            "country": "US",
            "contacts" : [
                { "localId" : "c1", "address" : "some address 1" },
                { "localId" : "c2", "address" : "some address 2" },
                { "localId" : "c3", "address" : "some address 3" }
            ]
        },
        {
            "name" : "group2",
            "country": "Canada",
            "contacts" : [
                { "localId" : "c1", "address" : "some address 1" },
                { "localId" : "c3", "address" : "some address 3" }
            ]
        }
    ]
}

结果应如下所示:

{
    "email" : "john.doe@acme.com",
    "name" : " John Doe",
    "groups" : [
        {
            "name" : "group1",
            "country": "US",
            "contacts" : [
                {
                  "localId" : "c3", 
                  "address" : "some address 3" 
                }
            ]
        }
    ]
}

所以我的条件是:

groups.name="group1"
groups.contacts.localId="c3"

如何使用ecma6 js函数实现它? 内存负载最小? 我在nodejs env > = 8.9.0中

更新:

这是我失败的尝试:

const conditions = {"groups.name": "group1", "groups.contacts.localId": "c3"};
let res = mylist.map((i)=>{
  return {
      email: i.email,
      name: i.name,
      groupsName: conditions.groups.name
  }

})

您可以使用filter()相当简洁地完成此操作。 如果首先过滤组名,您将不会浪费时间过滤联系人:

 let obj = { "email": "john.doe@acme.com", "name": " John Doe", "groups": [{ "name": "group1", "country": "US", "contacts": [{ "localId": "c1", "address": "some address 1" }, { "localId": "c2", "address": "some address 2" }, { "localId": "c3", "address": "some address 3" } ] }, { "name": "group2", "country": "Canada", "contacts": [{ "localId": "c1", "address": "some address 1" }, { "localId": "c3", "address": "some address 3" } ] } ] } let newObj = { "email": obj.email, "name": obj.name, "groups": obj.groups.filter(item => item.name == "group1").map(g => (g.contacts = g.contacts.filter(c => c.localId == "c3"), g)) } console.log(newObj) 

您可以使用filtermap 如果obj是您的初始对象,则可以执行以下操作:

obj.groups = obj.groups.filter((g)=>g.name==="group1")
for(int i = 0; i < obj.groups.length;i++)
{
    obj.groups[i].contacts = obj.groups[i].contacts.filter((c)=>c.localId==="c3"))
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM