代码之家  ›  专栏  ›  技术社区  ›  Onyx

我有一个基于选定城市的不同长度的对象数组。如何选择包含某一属性对象的元素?

  •  0
  • Onyx  · 技术社区  · 6 年前

    在我的例子中,我想选择包含具有属性的对象的元素 types: ['locality', 'political'] .

    7:
        address_components: (3) [{…}, {…}, {…}]
        types: Array(2)
            0: "locality"
            1: "political"
    8:
        address_components: (2) [{…}, {…}]
        types: Array(2)
            0: "administrative_area_level_1"
            1: "political"
    

    如您所见,每个元素都有一个 types 属性,该属性是数组。我正在尝试使用 类型:['locality','political'] 而不是索引。

    遗憾的是,我不知道如何做到这一点,所以我没有补充任何代码。

    [
      {
        "address_components": [
          {
            "long_name": "19",
            "short_name": "19",
            "types": [
              "street_number"
            ]
          },
          {
            "long_name": "Clanbrassil Street Lower",
            "short_name": "Clanbrassil Street Lower",
            "types": [
              "route"
            ]
          },
          {
            "long_name": "Wood Quay",
            "short_name": "Wood Quay",
            "types": [
              "neighborhood",
              "political"
            ]
          },
          {
            "long_name": "Dublin 8",
            "short_name": "Dublin 8",
            "types": [
              "postal_town"
            ]
          },
          {
            "long_name": "County Dublin",
            "short_name": "County Dublin",
            "types": [
              "administrative_area_level_1",
              "political"
            ]
          },
          {
            "long_name": "Ireland",
            "short_name": "IE",
            "types": [
              "country",
              "political"
            ]
          },
          {
            "long_name": "D08 X798",
            "short_name": "D08 X798",
            "types": [
              "postal_code"
            ]
          }
        ],
        "formatted_address": "19 Clanbrassil Street Lower, Wood Quay, Dublin, D08 X798, Ireland",
        "geometry": {
          "location": {
            "lat": 53.3349244,
            "lng": -6.2740099
          },
          "location_type": "ROOFTOP",
          "viewport": {
            "northeast": {
              "lat": 53.3362733802915,
              "lng": -6.272660919708499
            },
            "southwest": {
              "lat": 53.3335754197085,
              "lng": -6.275358880291503
            }
          }
        },
        "place_id": "ChIJZckoE7wNZ0gRgHdbQYYvYTk",
        "plus_code": {
          "compound_code": "8PMG+X9 Dublin, County Dublin, Ireland",
          "global_code": "9C5M8PMG+X9"
        },
        "types": [
          "cafe",
          "establishment",
          "food",
          "point_of_interest"
        ]
      },
      {
        "address_components": [
          {
            "long_name": "21",
            "short_name": "21",
            "types": [
              "street_number"
            ]
          },
          {
            "long_name": "R137",
            "short_name": "R137",
            "types": [
              "route"
            ]
          },
          {
            "long_name": "Wood Quay",
            "short_name": "Wood Quay",
            "types": [
              "neighborhood",
              "political"
            ]
          },
          {
            "long_name": "Dublin 8",
            "short_name": "Dublin 8",
            "types": [
              "postal_town"
            ]
          },
          {
            "long_name": "County Dublin",
            "short_name": "County Dublin",
            "types": [
              "administrative_area_level_1",
              "political"
            ]
          },
          {
            "long_name": "Ireland",
            "short_name": "IE",
            "types": [
              "country",
              "political"
            ]
          }
        ],
        "formatted_address": "21 R137, Wood Quay, Dublin, Ireland",
        "geometry": {
          "location": {
            "lat": 53.3348735,
            "lng": -6.273865
          },
          "location_type": "ROOFTOP",
          "viewport": {
            "northeast": {
              "lat": 53.3362224802915,
              "lng": -6.272516019708497
            },
            "southwest": {
              "lat": 53.3335245197085,
              "lng": -6.275213980291502
            }
          }
        },
        "place_id": "ChIJYVO9ECIMZ0gR2bQrf0Ktmso",
        "plus_code": {
          "compound_code": "8PMG+WF Dublin, County Dublin, Ireland",
          "global_code": "9C5M8PMG+WF"
        },
        "types": [
          "street_address"
        ]
      },
      {
        "address_components": [
          {
            "long_name": "18",
            "short_name": "18",
            "types": [
              "street_number"
            ]
          },
          {
            "long_name": "Clanbrassil Street Lower",
            "short_name": "Clanbrassil Street Lower",
            "types": [
              "route"
            ]
          },
          {
            "long_name": "Wood Quay",
            "short_name": "Wood Quay",
            "types": [
              "neighborhood",
              "political"
            ]
          },
          {
            "long_name": "Dublin 8",
            "short_name": "Dublin 8",
            "types": [
              "postal_town"
            ]
          },
          {
            "long_name": "County Dublin",
            "short_name": "County Dublin",
            "types": [
              "administrative_area_level_1",
              "political"
            ]
          },
          {
            "long_name": "Ireland",
            "short_name": "IE",
            "types": [
              "country",
              "political"
            ]
          }
        ],
        "formatted_address": "18 Clanbrassil Street Lower, Wood Quay, Dublin, Ireland",
        "geometry": {
          "location": {
            "lat": 53.3349987,
            "lng": -6.2739341
          },
          "location_type": "RANGE_INTERPOLATED",
          "viewport": {
            "northeast": {
              "lat": 53.3363476802915,
              "lng": -6.272585119708499
            },
            "southwest": {
              "lat": 53.3336497197085,
              "lng": -6.275283080291502
            }
          }
        },
        "place_id": "EiwxOCBDbGFuYnJhc3NpbCBTdHJlZXQgTG93ZXIsIER1YmxpbiwgSXJlbGFuZCIaEhgKFAoSCQexJhIiDGdIEUlWW2rVpRfqEBI",
        "types": [
          "street_address"
        ]
      },
      {
        "address_components": [
          {
            "long_name": "Clanbrassil Street Lower",
            "short_name": "R137",
            "types": [
              "route"
            ]
          },
          {
            "long_name": "Merchants Quay",
            "short_name": "Merchants Quay",
            "types": [
              "neighborhood",
              "political"
            ]
          },
          {
            "long_name": "Dublin 8",
            "short_name": "Dublin 8",
            "types": [
              "postal_town"
            ]
          },
          {
            "long_name": "County Dublin",
            "short_name": "County Dublin",
            "types": [
              "administrative_area_level_1",
              "political"
            ]
          },
          {
            "long_name": "Ireland",
            "short_name": "IE",
            "types": [
              "country",
              "political"
            ]
          }
        ],
        "formatted_address": "Clanbrassil Street Lower, Merchants Quay, Dublin, Ireland",
        "geometry": {
          "bounds": {
            "northeast": {
              "lat": 53.33516729999999,
              "lng": -6.273907599999999
            },
            "southwest": {
              "lat": 53.3345896,
              "lng": -6.274462
            }
          },
          "location": {
            "lat": 53.3348778,
            "lng": -6.274183000000001
          },
          "location_type": "GEOMETRIC_CENTER",
          "viewport": {
            "northeast": {
              "lat": 53.33622743029149,
              "lng": -6.272835819708497
            },
            "southwest": {
              "lat": 53.33352946970849,
              "lng": -6.275533780291502
            }
          }
        },
        "place_id": "ChIJzSxnESIMZ0gR8A77SK0ccBQ",
        "types": [
          "route"
        ]
      },
      {
        "address_components": [
          {
            "long_name": "Wood Quay",
            "short_name": "Wood Quay",
            "types": [
              "neighborhood",
              "political"
            ]
          },
          {
            "long_name": "Dublin 8",
            "short_name": "Dublin 8",
            "types": [
              "postal_town"
            ]
          },
          {
            "long_name": "County Dublin",
            "short_name": "County Dublin",
            "types": [
              "administrative_area_level_1",
              "political"
            ]
          },
          {
            "long_name": "Ireland",
            "short_name": "IE",
            "types": [
              "country",
              "political"
            ]
          }
        ],
        "formatted_address": "Wood Quay, Dublin, Ireland",
        "geometry": {
          "bounds": {
            "northeast": {
              "lat": 53.3454641,
              "lng": -6.2680769
            },
            "southwest": {
              "lat": 53.329641,
              "lng": -6.275519999999999
            }
          },
          "location": {
            "lat": 53.33275459999999,
            "lng": -6.2706881
          },
          "location_type": "APPROXIMATE",
          "viewport": {
            "northeast": {
              "lat": 53.3454641,
              "lng": -6.2680769
            },
            "southwest": {
              "lat": 53.329641,
              "lng": -6.275519999999999
            }
          }
        },
        "place_id": "ChIJl78TlSEMZ0gRUHtT8SkTqVA",
        "types": [
          "neighborhood",
          "political"
        ]
      },
      {
        "address_components": [
          {
            "long_name": "Dublin 8",
            "short_name": "Dublin 8",
            "types": [
              "postal_town"
            ]
          },
          {
            "long_name": "County Dublin",
            "short_name": "County Dublin",
            "types": [
              "administrative_area_level_1",
              "political"
            ]
          },
          {
            "long_name": "Ireland",
            "short_name": "IE",
            "types": [
              "country",
              "political"
            ]
          }
        ],
        "formatted_address": "Dublin 8, Ireland",
        "geometry": {
          "bounds": {
            "northeast": {
              "lat": 53.37132399999999,
              "lng": -6.2642699
            },
            "southwest": {
              "lat": 53.325953,
              "lng": -6.3563488
            }
          },
          "location": {
            "lat": 53.34785249999999,
            "lng": -6.318115199999999
          },
          "location_type": "APPROXIMATE",
          "viewport": {
            "northeast": {
              "lat": 53.37132399999999,
              "lng": -6.2642699
            },
            "southwest": {
              "lat": 53.325953,
              "lng": -6.3563488
            }
          }
        },
        "place_id": "ChIJLz14IT8MZ0gR2uKxYpAO0Bc",
        "types": [
          "postal_town"
        ]
      },
      {
        "address_components": [
          {
            "long_name": "Dublin City",
            "short_name": "Dublin City",
            "types": [
              "administrative_area_level_2",
              "political"
            ]
          },
          {
            "long_name": "County Dublin",
            "short_name": "County Dublin",
            "types": [
              "administrative_area_level_1",
              "political"
            ]
          },
          {
            "long_name": "Ireland",
            "short_name": "IE",
            "types": [
              "country",
              "political"
            ]
          }
        ],
        "formatted_address": "Dublin City, Co. Dublin, Ireland",
        "geometry": {
          "bounds": {
            "northeast": {
              "lat": 53.4111566,
              "lng": -6.11309
            },
            "southwest": {
              "lat": 53.2988569,
              "lng": -6.387080600000001
            }
          },
          "location": {
            "lat": 53.3603142,
            "lng": -6.315054200000001
          },
          "location_type": "APPROXIMATE",
          "viewport": {
            "northeast": {
              "lat": 53.4111566,
              "lng": -6.11309
            },
            "southwest": {
              "lat": 53.2988569,
              "lng": -6.387080600000001
            }
          }
        },
        "place_id": "ChIJv2RI7foRZ0gRwAKA8azHAAM",
        "types": [
          "administrative_area_level_2",
          "political"
        ]
      },
      {
        "address_components": [
          {
            "long_name": "Dublin",
            "short_name": "Dublin",
            "types": [
              "locality",
              "political"
            ]
          },
          {
            "long_name": "County Dublin",
            "short_name": "County Dublin",
            "types": [
              "administrative_area_level_1",
              "political"
            ]
          },
          {
            "long_name": "Ireland",
            "short_name": "IE",
            "types": [
              "country",
              "political"
            ]
          }
        ],
        "formatted_address": "Dublin, Ireland",
        "geometry": {
          "bounds": {
            "northeast": {
              "lat": 53.42521010000001,
              "lng": -6.0439235
            },
            "southwest": {
              "lat": 53.22343009999999,
              "lng": -6.4474847
            }
          },
          "location": {
            "lat": 53.3498053,
            "lng": -6.2603097
          },
          "location_type": "APPROXIMATE",
          "viewport": {
            "northeast": {
              "lat": 53.42521010000001,
              "lng": -6.0439235
            },
            "southwest": {
              "lat": 53.22343009999999,
              "lng": -6.4474847
            }
          }
        },
        "place_id": "ChIJL6wn6oAOZ0gRoHExl6nHAAo",
        "types": [
          "locality",
          "political"
        ]
      },
      {
        "address_components": [
          {
            "long_name": "County Dublin",
            "short_name": "County Dublin",
            "types": [
              "administrative_area_level_1",
              "political"
            ]
          },
          {
            "long_name": "Ireland",
            "short_name": "IE",
            "types": [
              "country",
              "political"
            ]
          }
        ],
        "formatted_address": "Co. Dublin, Ireland",
        "geometry": {
          "bounds": {
            "northeast": {
              "lat": 53.6347257,
              "lng": -5.9962748
            },
            "southwest": {
              "lat": 53.1781971,
              "lng": -6.5468798
            }
          },
          "location": {
            "lat": 53.3302033,
            "lng": -6.3105655
          },
          "location_type": "APPROXIMATE",
          "viewport": {
            "northeast": {
              "lat": 53.6347257,
              "lng": -5.9962748
            },
            "southwest": {
              "lat": 53.1781971,
              "lng": -6.5468798
            }
          }
        },
        "place_id": "ChIJv2RI7foRZ0gRwAKA8azHABg",
        "types": [
          "administrative_area_level_1",
          "political"
        ]
      },
      {
        "address_components": [
          {
            "long_name": "Ireland",
            "short_name": "IE",
            "types": [
              "country",
              "political"
            ]
          }
        ],
        "formatted_address": "Ireland",
        "geometry": {
          "bounds": {
            "northeast": {
              "lat": 55.4602,
              "lng": -5.668900100000001
            },
            "southwest": {
              "lat": 51.3066,
              "lng": -10.7666001
            }
          },
          "location": {
            "lat": 53.41291,
            "lng": -8.24389
          },
          "location_type": "APPROXIMATE",
          "viewport": {
            "northeast": {
              "lat": 55.4602,
              "lng": -5.668900100000001
            },
            "southwest": {
              "lat": 51.3066,
              "lng": -10.7666001
            }
          }
        },
        "place_id": "ChIJ-ydAXOS6WUgRCPTbzjQSfM8",
        "types": [
          "country",
          "political"
        ]
      }
    ]
    
    2 回复  |  直到 4 年前
        1
  •  2
  •   Jonas Wilms    6 年前

    您可以找到包含上述所有类型的元素:

     array.find(it => ['locality', 'political'].every(type => it.types.includes(type)))
    
        2
  •  1
  •   Jonas Wilms    6 年前

    那么,让我们来看看这里发生了什么。

    您有一个对象数组,需要找到并返回具有正确 types 数组。

    for(... of ...) 图案:

    for(let object of array){
        /* do stuff */
    }
    

    接下来,我们需要根据设置的条件测试每个对象。我们知道我们需要检查每个物体的 类型

    for(let object of array){
        if(someKindOfTest(object.types)){
            return object;
        }
    }
    

    那么,我们究竟如何进行这个测试呢?假设我们知道要找什么类型的。。。

    let requiredTypes = ["locality"];
    
    for(let object of array){
        if(someKindOfTest(object.types)){
            return object;
        }
    }
    

    ……我们可以设计一个测试,只有在对象具有所有所需类型时才能通过。听起来像是另一个循环的工作:

    let requiredTypes = ["locality"];
    
    for(let object of array){
        let hasAllRequiredTypes = true;
    
        //  test for each of the required types
    
        for(let requiredType of requiredTypes){
            if(!object.types.includes(requiredType)){
                // this object doesn't match one of our required types, that disqualifies it
    
                hasAllTypes = false; // flag this object as disqualified
                break; // end this loop over the required types
            }
        }
    
        if(hasAllRequiredTypes) return object;
    }