Как создать json с помощью JavaScript для цикла?

99

У меня есть массив тегов select.

<select id='uniqueID' name="status">
      <option value="1">Present</option>
      <option value="2">Absent</option>
 </select>

и я хочу создать объект json с двумя полями uniqueIDofSelect и optionValue в JavaScript.

Я использую getElementsByName ("status") и повторяю его.

РЕДАКТИРОВАТЬ

Мне нужно поставить как

[{"selectID":2,"OptionValue":"2"},
{"selectID":4,"optionvalue":"1"}]

и так далее...

Викас
источник
Я предполагаю, что optionValue должен быть атрибутом «value» каждого элемента «option»: 1, 2 и т. Д. Но каков идентификатор? Это текст? «Присутствует», «Отсутствует» и т. Д.?
система ПАУЗА
Итак, если ID - это uniqueID выбранного, тогда может быть только одно optionValue, верно? Я полагаю, вам нужен текущий выбор, а не массив всех вариантов?
система ПАУЗА

Ответы:

174

Насколько я понимаю ваш запрос, это должно работать:

<script>
//  var status  = document.getElementsByID("uniqueID"); // this works too
var status  = document.getElementsByName("status")[0];
var jsonArr = [];

for (var i = 0; i < status.options.length; i++) {
    jsonArr.push({
        id: status.options[i].text,
        optionValue: status.options[i].value
    });
}
</script>
Donohoe
источник
41
JSON - это объект, а не массив.
Гамбо
Создает массив объектов json. но мне нужен только один объект json.
Викас
1
Разве вам не нужно объявлять массив, например, var jsonObj = new Array (); Потому что твой пример не сработал для меня. Когда я перехожу на новый Array (), он работает.
Мяу
18
var jsonArr = [];создает новый массив. var jsonObj = {};создает новый объект
b_dubb
Итак, глупый вопрос, я знаю разницу между массивом объектов и объектом, который содержит массив объектов (в значительной степени разница между jsonArr = []и jsonObj = {}в этом посте). Я, может быть, слишком часто и, возможно, даже ошибочно, ссылался на объект, содержащий массив объектов, каждый из которых содержит (возможно, разные) пары имя / значение, как «объект JSON». Поскольку я знаком с простым синтаксисом JSON (например, с тем, что есть в реальном .jsonфайле), я знаю, что синтаксически это другое. Итак, могли бы вы также называть JSON просто массив объектов?
VoidKing
42
var sels = //Here is your array of SELECTs
var json = { };

for(var i = 0, l = sels.length; i < l; i++) {
  json[sels[i].id] = sels[i].value;
}
Джош Стодола
источник
8

Если вам нужен один объект JavaScript, например:

{ uniqueIDofSelect: "uniqueID", optionValue: "2" }

(где параметр 2, «Отсутствует» - текущий выбор), то следующий код должен его создать:

  var jsObj = null;
  var status = document.getElementsByName("status")[0];
  for (i = 0, i < status.options.length, ++i) {
     if (options[i].selected ) {
        jsObj = { uniqueIDofSelect: status.id, optionValue: options[i].value };
        break;
     }
  }

Если вам нужен массив всех таких объектов (а не только выбранный), используйте код Майкла, но замените его status.options[i].textна status.id.

Если вам нужна строка , содержащая JSON-представление выбранного объекта, используйте вместо этого:

  var jsonStr = "";
  var status = document.getElementsByName("status")[0];
  for (i = 0, i < status.options.length, ++i) {
     if (options[i].selected ) {
        jsonStr = '{ '
                  + '"uniqueIDofSelect" : '
                  + '"' + status.id + '"'
                  + ", "
                  + '"optionValue" : '
                  + '"'+ options[i].value + '"'
                  + ' }';
        break;
     }
  }
система ПАУЗА
источник
3

Если я хочу создать объект JavaScript из строки, сгенерированной циклом for, я бы использовал подход JSON to Object. Я бы сгенерировал строку JSON, повторяя цикл for, а затем использовал бы любую популярную платформу JavaScript для оценки JSON в Object.

Я использовал Prototype JavaScript Framework . У меня есть два массива с ключами и значениями. Я перебираю цикл for и генерирую допустимую строку JSON. Я использую функцию evalJSON () для преобразования строки JSON в объект JavaScript.

Вот пример кода. Попробовать на консоли FireBug

var key = ["color", "size", "fabric"];
var value = ["Black", "XL", "Cotton"];

var json = "{ ";
for(var i = 0; i < key.length; i++) {
    (i + 1) == key.length ? json += "\"" + key[i] + "\" : \"" + value[i] + "\"" : json += "\"" + key[i] + "\" : \"" + value[i] + "\",";
}
json += " }";
var obj = json.evalJSON(true);
console.log(obj);
Гауранг Джадиа
источник
1
Спасибо, чувак, это мне очень помогло, я использовал PARSE.json (jsonstring) вместо jsonstring.evalJSON (true);
Арно Бушо
0

Твой вопрос довольно сложно расшифровать, но я попробую его ответить.

Ты говоришь:

Я хочу создать объект json с двумя полями uniqueIDofSelectи optionValueв javascript.

А потом вы говорите:

Мне нужен вывод вроде

[{"selectID":2,"optionValue":"2"},
{"selectID":4,"optionvalue":"1"}]

Что ж, в этом примере выходных данных нет поля с именем uniqueIDofSelect, а есть только optionValue.

В любом случае, вы запрашиваете массив объектов ...

Тогда в комментарии к ответу Майклза вы говорите:

Создает массив объектов json. но мне нужен только один объект json.

Значит, вам не нужен массив объектов?

Что ты тогда хочешь?

Пожалуйста, прими свое решение.

Рене Саарсу
источник
Первое: извините, что uniqueIDofSelect == selectID (Id элемента select, я могу сохранить идентификатор моей записи как идентификатор элемента select (для обновления записи). У меня также будет номер элемента select, сгенерированный циклом foreach. На самом деле этот цикл который мы используем в asp.net MVC для отображения перечисляемых объектов.2) Вы правы, моя ошибка в том, что я забавлял, что весь вывод - это один объект json. Но на самом деле это массив объекта. Так что ответ Майкла идеален. Спасибо, что указали.
Викас