【问题标题】:better way to check if a value is inside of a nested array - Javascript检查值是否在嵌套数组中的更好方法 - Javascript
【发布时间】:2019-09-05 06:38:33
【问题描述】:

我正在使用 Google Places API。我注意到当我进入机构时并不总是有邮政编码、国家、城市,如果有的话,它们并不总是在 address_components 数组中的同一索引中。

现在,我正在尝试查找它是否具有上面列出的任何内容,以及它是否确实返回了值。有没有更好的方法来实现这一点:

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"
        ]
      }
    ]

【问题讨论】:

    标签: javascript typescript google-maps google-places-api googleplacesautocomplete


    【解决方案1】:

    首先,我会改变这个:

    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 的返回值不适合您时,才需要|| null 部分。

    速度

    如果在您的问题中“更好”意味着“更快”,那么请使用老式的 for 循环:

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

    【讨论】:

    • 太酷了。你能解释一下这部分const {types} 现在哪个解决方案更快?
    • {types} 是解构的,就像[i] 也是解构的一样,但它是从不同的迭代器中解构的。您使用了.entries(),实际上它为您提供了成对的 [index, value],并且您只使用了其中的索引。我把数组本身当作可迭代的,它只给出值(对象)。对于那些我使用解构来取出类型的人。如果您关心的是速度,那么没有什么比老式的 for 循环更好的了(直到引擎更好地优化新结构)。
    • 在这种情况下,速度不是问题,因为数据集总是非常小,通过更好的方式,我的意思是更聪明的方式,你的回答很棒。我在 JS 上学到了新东西。我对这个... types.includes(type)) || {} 如果为 true 返回一个对象,如果不是返回 {},如果它返回 {},那么 {}.long_name 将是 undefined,如果它是 undefined,它将返回 @ 987654341@
    • 是的,你没看错。有一个“陷阱”,如果long_name 是一个空字符串,那么你也会得到一个null。最好使用undefined 作为函数的返回值,然后跳过null
    猜你喜欢
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    • 2018-01-15
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多