lodash:如何不区分大小写 _.find()

新手上路,请多包涵

我有一个复杂的数据结构,带有嵌套数组,我需要使用不区分大小写的搜索来查找具有字符串值的元素。

由于执行嵌套查询的简单语法,我已经开始使用 lodash - 它工作得很好,但搜索区分大小写。

我想找到一个“address_components”元素,其“types”值为“route”,“long_name”值等于名为“targetStreet”的参数。

这是我目前拥有的 lodash 代码:

     var result = _.find(geocodeResult,
        {
            'address_components': [
                {
                    types: ['route'],
                    'long_name': targetStreet
                }
            ]
        });

问题: 如何使“long_name”属性的匹配不区分大小写?

下面是“geocodeResult”数据结构的示例(它实际上是一个 Google Geocoding Result 对象)。

请注意,此数据结构是动态的…Google 将尽可能返回最具体的结果,但如果找不到街道的匹配项,则不会返回街道组件,例如“address_components”中的“types”数组具有不确定的值。

     [
  {
    "address_components": [
      {
        "long_name": "V&a Lane",
        "short_name": "V&a Ln",
        "types": [
          "route"
        ]
      },
      {
        "long_name": "Coonawarra",
        "short_name": "Coonawarra",
        "types": [
          "locality",
          "political"
        ]
      },
      {
        "long_name": "Wattle Range Council",
        "short_name": "Wattle Range",
        "types": [
          "administrative_area_level_2",
          "political"
        ]
      },
      {
        "long_name": "South Australia",
        "short_name": "SA",
        "types": [
          "administrative_area_level_1",
          "political"
        ]
      },
      {
        "long_name": "Australia",
        "short_name": "AU",
        "types": [
          "country",
          "political"
        ]
      },
      {
        "long_name": "5263",
        "short_name": "5263",
        "types": [
          "postal_code"
        ]
      }
    ],
    "formatted_address": "V&a Ln, Coonawarra SA 5263, Australia",
    "geometry": {
      "bounds": {
        "south": -37.3238134,
        "west": 140.8154452,
        "north": -37.3228868,
        "east": 140.97295129999998
      },
      "location": {
        "lat": -37.3233904,
        "lng": 140.89510410000003
      },
      "location_type": "GEOMETRIC_CENTER",
      "viewport": {
        "south": -37.3246990802915,
        "west": 140.8154452,
        "north": -37.3220011197085,
        "east": 140.97295129999998
      }
    },
    "partial_match": true,
    "place_id": "EiVWJmEgTG4sIENvb25hd2FycmEgU0EgNTI2MywgQXVzdHJhbGlh",
    "types": [
      "route"
    ]
  },
  {
    "address_components": [
      {
        "long_name": "V&a Lane",
        "short_name": "V&a Ln",
        "types": [
          "route"
        ]
      },
      {
        "long_name": "Coonawarra",
        "short_name": "Coonawarra",
        "types": [
          "locality",
          "political"
        ]
      },
      {
        "long_name": "Wattle Range Council",
        "short_name": "Wattle Range",
        "types": [
          "administrative_area_level_2",
          "political"
        ]
      },
      {
        "long_name": "South Australia",
        "short_name": "SA",
        "types": [
          "administrative_area_level_1",
          "political"
        ]
      },
      {
        "long_name": "Australia",
        "short_name": "AU",
        "types": [
          "country",
          "political"
        ]
      },
      {
        "long_name": "5263",
        "short_name": "5263",
        "types": [
          "postal_code"
        ]
      }
    ],
    "formatted_address": "V&a Ln, Coonawarra SA 5263, Australia",
    "geometry": {
      "bounds": {
        "south": -37.3238134,
        "west": 140.8154452,
        "north": -37.3228868,
        "east": 140.97295129999998
      },
      "location": {
        "lat": -37.3233904,
        "lng": 140.89510410000003
      },
      "location_type": "GEOMETRIC_CENTER",
      "viewport": {
        "south": -37.3246990802915,
        "west": 140.8154452,
        "north": -37.3220011197085,
        "east": 140.97295129999998
      }
    },
    "partial_match": true,
    "place_id": "EiVWJmEgTG4sIENvb25hd2FycmEgU0EgNTI2MywgQXVzdHJhbGlh",
    "types": [
      "route"
    ]
  }
]

原文由 JTech 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 947
2 个回答

您使用的方式 lodash.find 对应于 lodash.match 速记( https://lodash.com/docs/4.17.4#find ),不幸的是你不能通过正则表达式或函数来获取在您的对象属性中进行不敏感的搜索。

你必须写类似的东西来执行搜索(假设 targetStreet 小写):

 var result = _.find(geoCodeResult, function (result) {
   return _.find(result.address_components, function(component) {
      return _.includes(component.types, 'route')
        && component.long_name.toLowerCase() === targetStreet;
   });
});

您也可以在不使用 lodash 的情况下编写它,使用 ES6 语法 + Array.prototype.findArray.prototype.includes (对于最新的浏览器)

 const result = geoCodeResult.find(result =>
   result.address_components.find(({ types, long_name }) =>
      types.includes('route') && long_name.toLowerCase() === targetStreet
   ));

原文由 Freez 发布,翻译遵循 CC BY-SA 4.0 许可协议

在比较之前将两个值转换为相同的大小写。

 var search = 'Australia'.toLowerCase();

var result = _.find(geoCodeResult, function (location) {
    return location.long_name.toLowerCase() === search;
});

原文由 fubar 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题