Необходимо понимать массивы, объекты и свойства JavaScript

#javascript #jquery

#javascript #jquery

Вопрос:

Сначала посмотрите, как должен выглядеть JSON

 [
    {"ShortCode":"US","Name":"United States"},
    {"ShortCode":"CA","Name":"Canada"},
    {"ShortCode":"AG","Name":"Antigua and/or Barbuda"}
]
 

Код:

 var countries = [];
map = {};

// This is going to make an HTTP post request to the controller
return $.post('/Client/CountryLookup', { query: query }, function (data) {
    // Loop through and push to the array
    $.each(data, function (i, country) {
    map[country.Name] = country;
    countries.push(country.Name);
});
 

$post() вернет приведенный выше json, и мне нужно проанализировать json в каждом цикле
, но я не понимаю, что будет храниться в объекте map в этой строке map[country.Name] = country;

Предположим, название страны — «united state», так что на самом деле хранилище будет map['united state']=country , что это значит?

Даже при сохранении кода map{} доступ позже, как

 var selectedShortCode = map[item].ShortCode;
 

Как map может иметь свойство like ShortCode ??

Поэтому, пожалуйста, подробно обсудите этот тип техники кодирования и помогите мне понять приведенный выше код с помощью еще нескольких примеров. Спасибо

Комментарии:

1. Добро пожаловать в удивительный мир асинхронности ! Вы не можете этого сделать.

2. Вы устанавливаете индекс (название страны) для объекта равным объекту, содержащему название страны. Так console.log(map['United States'].Name) будет выводиться United States .

3. @SLaks почему бы и нет? Введен в заблуждение отсутствием отступов?

4. @CupawnTae: он пытается получить доступ map после обратного вызова.

5. @SLaks возможно, но это не очевидно из вопроса — это зависит от того, как он использует возвращаемое значение из своей функции — возвращаемое значение будет обещанием, и если он вставит свой код, promise.done() он будет работать просто отлично. Хороший момент, хотя!

Ответ №1:

ваша карта — это литерал объекта, определенный также как хэш, словарь или реляционный массив на других языках, который в основном связывает ключ (Strin) со значением (любым), в данном случае связывает названия стран с фактическим объектом country вот почему

структура карты после вашей карты [country.Name ] = операции в стране будут { «Соединенные Штаты»:{«Короткий код»: «США», «Название»: «Соединенные Штаты»}, «Канада»:{«Короткий код»: «КАЛИФОРНИЯ», «Название»:»Канада»}, «Антигуа и / или Барбуда»: {«Короткий код»:»AG»,»Имя»:»Антигуа и / или Барбуда»} }

затем, когда вы делаете

 map["United States"]
 

вы получаете

{«ShortCode»:»US»,»Name»: «Соединенные Штаты»}

Комментарии:

1. но как мы можем получить доступ таким образом, map[item] . Короткий код? как здесь используется свойство ShortCode? пожалуйста, предоставьте какой-нибудь пример кода, чтобы понять это динамическое свойство? спасибо за ответ.

2. то, что написано в ответе с использованием map[item], совпадает с использованием map[«Соединенные Штаты»], если item==»Соединенные Штаты» map[«Соединенные Штаты»] является объектом, содержащим короткий код свойств и название, следовательно, map[«Соединенные Штаты»] . Короткий код — это «МЫ».

Ответ №2:

Ваш data после $.post вызова будет:

 data = 
[
    { ShortCode: "US", Name: "United States" },
    { ShortCode: "CA", Name: "Canada" },
    { ShortCode: "AG", Name: "Antigua and/or Barbuda" }
];
 

Взгляните на .each документацию по функциям jQuery.

В принципе, его можно переписать следующим образом:

 for(var i in data)
{
    var country = data[i];
    map[country.Name] = country;
    countries.push(country.Name);
}
 

Таким образом, вы получаете:

 map =
{
    "United States": { ShortCode: "US", Name: "United States" },
    "Canada": { ShortCode: "CA", Name: "Canada" },
    "Antigua and/or Barbuda": { ShortCode: "AG", Name: "Antigua and/or Barbuda" }
};

countries = [ "United States", "Canada", "Antigua and/or Barbuda" ];
 

Итак, ваш код анализирует json и выводит все существующие страны ( countries ) и все связанные с ними данные ( map ) в двух разных объектах. countries может использоваться для простого итерации через map , но в этом нет реальной необходимости.

Редактировать:

 var country = data[0];
// country = { ShortCode: "US", Name: "United States" };
map[country.Name] = country;
// map["United States"] = { ShortCode: "US", Name: "United States" };
 

Чтобы вы могли позже принять map["United States"] , он вернет вам объект { ShortCode: "US", Name: "United States" } , после чего вы можете просто получить доступ к его свойству ShortCode , если захотите.

Имейте в виду, что все переменные в JavaScript передаются по ссылке, и это myObject["someProperty"] точно так же, как myObject.someProperty .

Комментарии:

1. но как мы можем получить доступ таким образом, map[item] . Короткий код? как здесь используется свойство ShortCode? пожалуйста, предоставьте какой-нибудь пример кода, чтобы понять это динамическое свойство? спасибо за ответ.

2. Отредактировано. Надеюсь, это поможет вам понять.