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

标签 javascript arrays node.js object ecmascript-6

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

{
    "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环境>=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)

关于基于多个条件的javascript对象过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48133563/

相关文章:

javascript - AngularJS:在保存到 Controller 之前从服务获取更新的数据

javascript - node_modules 文件夹太大

arrays - 如何将 slice 转换为固定大小的数组?

javascript - ( Node :5540) Warning: a promise was created in a handler but was not returned from it

node.js - Kafka Node - client.createTopic 失败代码 38

node.js - 当我使用 Ghost-cli 安装 Ghost 时出现错误

javascript - 我怎样才能捕捉到链接的打开情况

javascript - 使用 jQuery 从列表项中解包元素

c - *p = array[i] 的效果?

c# - 编程语言,您可以在其中通过 引用数组元素。 (点)