Как разделить ответ json в двух переменных?

#jquery #json

#jquery #json

Вопрос:

Прямо сейчас ответ json выглядит как

 ["AG","ANTIGUA AND BARBUDA","AU","AUSTRALIA","BR","BRAZIL","CA","CANADA"] 
  

я могу сделать это

 ["AG,ANTIGUA AND BARBUDA","AU,AUSTRALIA","BR,BRAZIL","CA,CANADA"]
  

если с этим проще работать или в любом другом стиле.

что мне нужно, так это разделить его на две переменные, одну для кода округа, другую для названия страны

    ...success: function( json ) {
    $.each(json, function(i, value) {
          $('#country').append($('<option>').text(value).attr('value', value));
    };  
      });
  

теперь та же переменная переходит в значение и название опции, мне нужно указать код страны в опции и название страны в переменной.

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

1. Похоже, что вы отправляете двухбуквенную аббревиатуру вместе с полным названием страны, но не используете аббревиатуру, вы собираетесь использовать ее, или вы можете вообще не отправлять ее?

Ответ №1:

Почему бы не вернуть их в первую очередь как объекты JSON? Что-то вроде

 [{"ID":"AG", "Text":"ANTIGUA AND BARBUDA"},{"ID":"AU", "Text":"Australia"}]
  

Тогда вы могли бы сделать что-то вроде

 $.each( result, function( value ){
    $('#country').append(
        $("<option>").text(value.Text).attr("value", value.Text)
    );
});
  

Редактировать:
Приведенный выше код предполагает, что вы уже преобразовали данные, отправленные с сервера, в массив JavaScript. Есть два способа приблизиться к этому:

  1. Вы можете запросить данные, используя getJSON метод, и jQuery проанализирует возвращаемое значение для вас
  2. Вы можете проанализировать данные самостоятельно, используя parseJSON

Любой метод примет правильно отформатированную строку JSON и вернет вам объект JavaScript для работы

Ответ №2:

Если вы выберете свой 2-й вариант, вы можете разделить строку как таковую

 var countries = jQuery.parseJSON(json);
$.each(countries, function(i, value) {
    var country = value.split(",");
    $('#country').append($('<option>').text(country[1]).attr('value', country[0]));

};
  

РЕДАКТИРОВАТЬ: Сначала вам нужно проанализировать строку JSON, чтобы вы могли использовать объект Array и выполнять цикл по нему. Смотрите мой обновленный код выше.

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

1. Что это делает, это <option value="A">G</option> нарушение двухбуквенного кода страны для значения и имени

2. Ему не обязательно его анализировать, он мог бы использовать метод getJSON , и это произошло бы автоматически.

3. @R0MANARMY: Да, это просто вызовет parseJSON внутренне 🙂

4. Скорее всего, но это на одну вещь меньше, о которой ему нужно беспокоиться :).

Ответ №3:

Если вы можете сделать это:

 [["AG","ANTIGUA AND BARBUDA"],["AU","AUSTRALIA"],["BR","BRAZIL"],["CA","CANADA"]] 
  

Тогда вы могли бы использовать это:

 success: function( json ) {
  $.each(json, function(i, value) {
    $('#country').append($('<option>').text(value[1]).attr('value', value[0]));
  };  
});
  

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

1. мой вывод выглядит не так, он заключен в двойные кавычки каждый раз, когда я пишу в json, поэтому он выглядит как [«[AG, АНТИГУА И БАРБУДА]», «[AU, АВСТРАЛИЯ]», «[BR, БРАЗИЛИЯ]», «[CA, КАНАДА]»] и выводит первую букву в названии опции и в значении «[»

Ответ №4:

Если вы хотите воспользоваться этим:

 var array = ["AG","ANTIGUA AND BARBUDA","AU","AUSTRALIA","BR","BRAZIL","CA","CANADA"];
  

И сделать его массивом объектов пары ключ / значение, вы могли бы сделать что-то вроде этого:

 result = [];

for (var i = 0; i < array.length; i = i   2) {
  result.push({ array[i] : array[i   1]});
}
  

В итоге вы получите эквивалент этого в result :

 result = [
  { "AG" : "ANTIGUA AND BARBUDA" },
  { "AU" : "AUSTRALIA" },
  { "BR" : "BRAZIL" },
  { "CA" : "CANADA" }
];
  

Обновление: Если все, что вас волнует, это добавление их в select, вы можете сделать это таким образом:

 var array = ["AG","ANTIGUA AND BARBUDA","AU","AUSTRALIA","BR","BRAZIL","CA","CANADA"];

for (var i = 0; i < array.length; i = i   2) {
  // Using this object initializer to build the options has a caching benefit.
  $('#country').append($('<option>', {
    value: array[i],
    text: array[i   1]
  }));
}
  

Как бы то ни было, в данном случае это может быть незначительно, но такой подход относительно медленный. Если вы заметили проблемы с производительностью, рассмотрите возможность использования .detach() метода для извлечения #country из DOM во время добавления опций, а затем прикрепите его обратно в конце.

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

1. что мне делать после этого, мне нужно окончательное решение, я не так хорошо знаю jquerry

2. Обновлено, чтобы предоставить вам решение, которое вам нужно (я думаю).