检查值是否在嵌套数组内的更好方法 - Javascript

better way to check if a value is inside of a nested array - Javascript

我正在与 Google 个地点 API 合作。我注意到当我进入机构时并不总是有邮政编码、国家、城市,如果有,它们也不总是在 address_components 数组中的相同索引中。

现在,我试图找出它是否具有上面列出的任何内容,如果它具有 return 值。有没有更好的方法来实现这个:

getPlaceTypeValue(addressComponents: Places[], type: string): string {
    let value = null;
    for (const [i] of addressComponents.entries()) {
      if (addressComponents[i].types.includes(type)) {
        value = addressComponents[i].long_name;
        break;
      }
    }
    return value;
  } 
console.log(this.placesService.getPlaceTypeValue(
address.address_components, 'postal_code'));
//Returns 77500

数据

[
      {
        "long_name": "Hotel Zone",
        "short_name": "Hotel Zone",
        "types": [
          "sublocality_level_1",
          "sublocality",
          "political"
        ]
      },
      {
        "long_name": "Kukulcan Boulevard",
        "short_name": "Kukulcan Boulevard",
        "types": [
          "neighborhood",
          "political"
        ]
      },
      {
        "long_name": "Cancún",
        "short_name": "Cancún",
        "types": [
          "locality",
          "political"
        ]
      },
      {
        "long_name": "Quintana Roo",
        "short_name": "Q.R.",
        "types": [
          "administrative_area_level_1",
          "political"
        ]
      },
      {
        "long_name": "Mexico",
        "short_name": "MX",
        "types": [
          "country",
          "political"
        ]
      },
      {
        "long_name": "77500",
        "short_name": "77500",
        "types": [
          "postal_code"
        ]
      }
    ]

首先,我会改变这个:

for (const [i] of addressComponents.entries()) {
  if (addressComponents[i].types.includes(type)) {

对此:

for (const {types} of addressComponents) {
  if (types.includes(type)) {

或者,如果您喜欢更 功能性 的方法,请在单行 return 语句中使用 Array#find

return (addressComponents.find(({types}) => types.includes(type)) || {}).long_name || null;

仅当 undefined 的 return 值不适合您时才需要 || null 部分。

速度

如果在您的问题中 "better" 表示 "faster",那么请使用老式的 for 循环:

for (let i = 0, len = addressComponents.length; i < len; i++) {
  if (addressComponents[i].types.includes(type)) {