0

子の値の 1 つに基づいて、配列内の要素を選択しようとしています。

例として、Google Maps API ジオコード リクエストから返された結果を使用すると、次の形式の配列が得られます。

{
      "address_components": [
        {
          "long_name": "Renshaw St",
          "short_name": "Renshaw St",
          "types": [
            "route"
          ]
        },
        {
          "long_name": "Eccles",
          "short_name": "Eccles",
          "types": [
            "locality",
            "political"
          ]
        },
        {
          "long_name": "Greater Manchester",
          "short_name": "Gt Man",
          "types": [
            "administrative_area_level_2",
            "political"
          ]
        },
        {
          "long_name": "United Kingdom",
          "short_name": "GB",
          "types": [
            "country",
            "political"
          ]
        },
        {
          "long_name": "M30 0PQ",
          "short_name": "M30 0PQ",
          "types": [
            "postal_code"
          ]
        },
        {
          "long_name": "Manchester",
          "short_name": "Manchester",
          "types": [
            "postal_town"
          ]
        }
      ],
      "formatted_address": "Renshaw St, Eccles, Manchester, Greater Manchester M30 0PQ, UK",
      "geometry": {
        "bounds": {
          "northeast": {
            "lat": 53.48266090000001,
            "lng": -2.35206530
          },
          "southwest": {
            "lat": 53.48128999999999,
            "lng": -2.35324410
          }
        },
        "location": {
          "lat": 53.4822450,
          "lng": -2.35294730
        },
        "location_type": "GEOMETRIC_CENTER",
        "viewport": {
          "northeast": {
            "lat": 53.48332443029150,
            "lng": -2.351305719708498
          },
          "southwest": {
            "lat": 53.48062646970850,
            "lng": -2.354003680291502
          }
        }
      },
      "types": [
        "route"
      ]
    }

指定した値と等しいaddress_component->long_name要素を持つを選択したいと思います。type

array上記と a keyto find をパラメーターとして取り、うまく機能するように見える次のコードを作成しました。

function getAddressComponent(key, result) {

  var rtn;

  $.each(result,function(index,value){
    if( result[index].types[0] == key ) rtn = result[index].long_name;
  });

  return rtn;    
}

しかし、いくつかの異なる方法で実行されているのを見て、最適な方法を使用したいので、誰かがより良いアプローチを提案できるかどうか疑問に思っていました.

4

2 に答える 2

1

jQuery.each を使用する理由はありません。通常の for ループはここではさらに短くなります。

function getNameByFirstType(key, result) {
    for (var i=0; i<result.length; i++)
        if (result[i].types[0] == key)
            return result[i].long_name;
    return false;    
}

getNameByFirstType("country", data.address_components);

typesまた、配列の最初のメンバーのみをチェックする理由がわかりませんが、これは予想される動作だと思います。

于 2012-07-24T12:36:39.367 に答える
1

あなたのコードはそれほど長くはありません..笑。結果が見つかったらすぐに結果を返すことができます。これは、ループを終了できるためです。そして、私は jQuery forEach を調査しませんでしたが、以下のコードよりも短くすることはできませんでした。

これはどのように?

function findAdressComponentByLongName( findString ) {

    var addressComponents = data.address_components,
        i = 0,
        ln = addressComponents.length;

    for( ; i < ln; i++ ) {

        if( addressComponents[ i ].long_name == findString ) {

            return addressComponents[ i ];
        }
    }
}
于 2012-07-24T12:16:07.917 に答える