2010-09-16 2 views
1

Я использую JQuery для получения данных о городе из геоданных. Моя проблема в том, когда я хочу извлечь значение для элементов sub-array при использовании функции отображения JQuery.Карта JQuery и JSON - Получение элементов вспомогательных элементов

В этом примере, если я хочу получить ссылку в Википедии, как я могу это сделать?

Я пробовал: википедии: item.alternateNames.lang [ 'ссылка']

, но не ожидал, что это будет действительно работать. Кто-нибудь знает, кто я могу извлечь элементы sub-массива?

Вот биты кода:

JSON РЕЗУЛЬТАТ

"geonames": [{ 
"alternateNames": [ 
    { 
    "name": "Rancho Cucamonga", 
    "lang": "en" 
    }, 
    { 
    "name": "91739", 
    "lang": "post" 
    }, 
    { 
    "name": "http://en.wikipedia.org/wiki/Rancho_Cucamonga%2C_California", 
    "lang": "link" 
    } 

], 
adminCode2": "071", 
"countryName": "United States", 
"adminCode1": "CA", 
"fclName": "city, village,...", 
"elevation": 368, 
"score": 0.9999999403953552, 
"countryCode": "US", 
"lng": -117.5931084, 
"adminName2": "San Bernardino County", 
"adminName3": "", 
"fcodeName": "populated place", 

JQuery:

$("#city").autocomplete({ 
     source: function(request, response) { 
      $.ajax({ 
       url: "http://ws.geonames.org/searchJSON", 
       dataType: "jsonp", 
       data: { 
        featureClass: "P", 
        style: "full", 
        maxRows: 12, 
        name_startsWith: request.term 
       }, 
       success: function(data) { 

        response($.map(data.geonames, function(item) { 
         return { 
          label: item.name + (item.adminName1 ? ", " + item.adminName1 : "") + ", " + item.countryName, 
          value: item.name, 
          latitude: item.lat, 
          longitude: item.lng, 

          // problem here: how to get the value for the alternateNames.lang where lang = link 
          wikipedia: item.alternateNames.lang['link'] 

         } 
        })) 
       } 
      }) 
     }, 
+0

В качестве примечания, в формате JSON ваш отсутствующий цитату перед adminCode2. –

+0

Извините, что пришло от резки и вставки кода, так как я не хотел помещать все данные в сообщение. По фактическим данным он есть. – Frank

ответ

3

Try ...

wikipedia: item.alternateNames[2].name 

Но если вы хотите их искать ...

var name; 
$.each(item.alternateNames, function(){ 
    if (this.lang == 'link') { 
    name = this.name; 
    return false; 
    } 
}); 
+0

Спасибо, что это отлично сработало. Каждая запись может иметь несколько разных альтернативных имен, поэтому мне нужно было найти только те, у которых есть ключевая ссылка. – Frank

+0

Да, я так себе представлял. Рад, что это сработало. – BBonifield

0

Ваш alternateNames массив объектов, поэтому вам придется использовать индекс для извлекать объект из массива. Как только у вас есть объект, вы можете получить поле «lang»:

item.alternateNames[2].lang 

, который должен вернуть вам ссылку. Предполагается, что item является правильным родительским объектом alternateNames.

0

В то же аварии я найти следующий решить:

Вместо призывающих субэлементов lang развинтить map, вы можете указать только родительский элемент wikipedia: item.alternateNames. А после этого вы можете получить доступ к вложенным элементам из них в выбранном событии автозаполнения.

Это мой пример:

$("#Customer_Name ").autocomplete({ 
      source: function (request, response) { 
       $.ajax({ 
        url: '@Url.Action("LookupCustomers", "Customers")', type: "POST", dataType: "json", 
        data: { searchText: request.term, maxResults: 10 }, 
        success: function (data) { 

          response($.map(data, function (item) { 

         //respose($.each(data, function (item 

          return { 
           label: item.Name, 
           value: item.Name, 
           id: item.Id, 
           phone: item.Phone, 
           addressStreet: item.AddressStreet, 
           addressBuilding: item.AddressBuilding, 
           addressHousing: item.AddressHousing, 
           addressFlat: item.AddressFlat, 
           metroStationId: item.MetroStationId, 
           metroStation: item.MetroStation //trouble was here 

          } 
         })) 
        } 
       }) 
      }, 
      select: function (event, ui) { 
       document.getElementById("Customer_Id").value = ui.item.id; 
       document.getElementById("Customer_Name").value = ui.item.value; 
       document.getElementById("Customer_Phone").value = ui.item.phone; 
       document.getElementById("Customer_AddressStreet").value = ui.item.addressStreet; 
       document.getElementById("Customer_AddressBuilding").value = ui.item.addressBuilding; 
       document.getElementById("Customer_AddressHousing").value = ui.item.addressHousing; 
       document.getElementById("Customer_AddressFlat").value = ui.item.addressFlat; 
       document.getElementById("Customer_MetroStationId").value = ui.item.metroStationId; 
       document.getElementById("Customer_MetroStation_Name").value = ui.item.metroStation.Name; //and, trouble was here 
      } 
     }); 

 Смежные вопросы

  • Нет связанных вопросов^_^