【问题标题】:Filter one object with another object recursively递归地用另一个对象过滤一个对象
【发布时间】:2019-12-13 17:08:41
【问题描述】:

我想要做的是使用另一个对象过滤一个对象。我让它适用于名称或电子邮件等键,但问题在于它需要递归检查值的地址字段。

我有以下对象:

  {
    "id" : 1,
    "name": "Michael",
    "surname": "Smith",
    "emailAddress": "m.smith@gmail.com",
  },
  {
    "id": "2",
    "name": "Sam",
    "surname": "Smith",
    "emailAddress": "s.smith@gmail.com",
    "address": {
      "text": "123 Fake Street, Some Place, United kingdom",
      "street_number": "123",
      "route": "Fake Street",
      "locality": "Some Place",
      "country": "UK",
      "postcode": "HP18",
      "lat": 51.648858999292999,
      "lng": 4.08207329992999786,

    }
  },
  {
    "id": 3,
    "name": "Josh",
    "surname": "Fradley",
    "emailAddress": "myemai@gmail.com",
    "address": {
      "text": "1 Apple Park Way, Cupertino, CA, USA",
      "street_number": "1",
      "route": "Apple Park Way",
      "locality": "Cupertino",
      "administrative_area_level_1": "California",
      "country": "US",
      "postcode": "95014",
      "lat": 37.3346326,
      "lng": -122.01268240000002,
    }
  }
]

示例搜索对象

{
  "name": "",
  "phone": "",
  "address": "",
  "emailAddress": "myemai@gmail.com"
}

我用于电子邮件和姓名字段的代码

  let res =  array.filter(o => 
    Object.keys(searches).every(k => 
      o[k] && o[k].length ? removeDiacritics(o[k].toLowerCase()).indexOf(removeDiacritics(searches[k].toLowerCase())) >= 0 : true
   ));

我正在苦苦挣扎的是如何搜索作为对象的地址键,例如,如果我搜索“地址”:“假街”,它应该返回 id 2

有什么建议吗?

编辑:我忘了说过滤器数组是动态的,所以我不能在“地址”中硬编码,我在这里用作一个对象的例子

【问题讨论】:

  • 我认为你不需要递归。
  • 你为什么不能像array.filter(o => o.address && o.address.text && o.address.text.includes(searchString))这样的?
  • 是一个空字符串要搜索的值吗?
  • 这些过滤器可以是动态的,因此“地址”的值可能会改变。我以这里为例

标签: javascript object filter


【解决方案1】:

您可以使用本地函数并检查嵌套对象的对象值。

var data = [{ id: 1, name: "Michael", surname: "Smith", emailAddress: "m.smith@gmail.com" }, { id: "2", name: "Sam", surname: "Smith", emailAddress: "s.smith@gmail.com", address: { text: "123 Fake Street, Some Place, United kingdom", street_number: "123", route: "Fake Street", locality: "Some Place", country: "UK", postcode: "HP18", lat: 51.648858999293, lng: 4.082073299929998 } }, { id: 3, name: "Josh", surname: "Fradley", emailAddress: "myemai@gmail.com", address: { text: "1 Apple Park Way, Cupertino, CA, USA", street_number: "1", route: "Apple Park Way", locality: "Cupertino", administrative_area_level_1: "California", country: "US", postcode: "95014", lat: 37.3346326, lng: -122.01268240000001 } }],
    search = { name: "", phone: "", address: 123, emailAddress: "" },
    result = data.filter(o => Object.entries(search).every(([k, v]) => {
        function check(value) {
            return value && typeof value === 'object'
                ? Object.values(value).some(check)
                : value.toString().includes(v);
        }

        if (v === '') return true;
        if (k in o) return check(o[k]);
    }));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 这太近了,但我想通过地址中的所有键搜索地址,而不是特定的 street_number
  • 请添加搜索对象和结果。
  • {address : 123 } 将返回 id 2,例如 123 在文本中和街道号 { id: "2", name: "Sam", surname: "Smith", emailAddress: " s.smith@gmail.com”,地址:{ text:“123 Fake Street, Some Place, United Kingdom”,street_number:“123”,路线:“Fake Street”,地点:“Some Place”,国家:“UK ", 邮编: "HP18", 纬度: 51.648858999293, lng: 4.082073299929998 }
  • 您想使用地址对象 obj1 中的所有键搜索 obj1 键中的地址,并且您不想硬编码键地址...我的问题总是地址可能成为对象或其他键也可能是一个对象
  • 没有地址只是示例可能是产品或任何超过对象
猜你喜欢
  • 2020-03-14
  • 2022-09-27
  • 1970-01-01
  • 2021-10-30
  • 2021-05-14
  • 1970-01-01
  • 2018-10-03
相关资源
最近更新 更多