Como criar json por JavaScript para loop?

99

Eu tenho matriz de seleção de marca.

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

e eu quero criar um objeto json com dois campos 'uniqueIDofSelect e optionValue' em JavaScript.

Eu uso getElementsByName ("status") e itero sobre ele.

EDITAR

Eu preciso colocar como

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

e assim por diante...

Vikas
fonte
Presumo que optionValue deve ser o atributo 'valor' de cada elemento 'opção': 1, 2, etc. Mas qual é o ID? É o texto? "Presente", "Ausente", etc.?
PAUSA do sistema
Ok, então se ID for o uniqueID do select, então pode haver apenas um optionValue, certo? Suponho que você queira a seleção atual, e não uma matriz de todas as seleções.
PAUSA do sistema

Respostas:

174

Pelo que entendi de sua solicitação, isso deve funcionar:

<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
fonte
41
JSON é um objeto e não um array.
Gumbo
Ele cria um array de objetos json. mas preciso apenas de um objeto json.
Vikas
1
Você não tem que declarar array como var jsonObj = new Array (); porque seu exemplo não funcionou para mim. Quando eu mudo para o novo Array (), ele funciona.
Miau de
18
var jsonArr = [];cria um novo Array. var jsonObj = {};cria um novo objeto
b_dubb
Então, pergunta idiota, eu sei a diferença entre um array de objetos e um objeto que contém um array de objetos (basicamente, a diferença entre jsonArr = []e jsonObj = {}neste post). Tenho, talvez com muita freqüência, e talvez até mesmo erroneamente, referido a um objeto que contém uma matriz de objetos em que cada um contém (possivelmente diferentes) pares de nome / valor como um "objeto JSON". Por estar familiarizado com a sintaxe JSON simples (como o que você teria em um .jsonarquivo real ), sei que sintaticamente isso é diferente. Então, você também se referiria ao array de objetos como JSON?
VoidKing de
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;
}
Josh Stodola
fonte
8

Se você deseja um único objeto JavaScript, como o seguinte:

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

(onde a opção 2, "Ausente", é a seleção atual), o seguinte código deve produzi-la:

  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;
     }
  }

Se você quiser um array de todos esses objetos (não apenas o selecionado), use o código de Michael, mas troque status.options[i].textpor status.id.

Se você quiser uma string que contém uma representação JSON do objeto selecionado, use isto:

  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;
     }
  }
PAUSA do sistema
fonte
3

Se eu quiser criar um objeto JavaScript a partir de uma string gerada pelo loop for, eu faria uma abordagem JSON para o objeto. Eu geraria a string JSON iterando o loop for e, em seguida, usaria qualquer Framework JavaScript popular para avaliar JSON para Object.

Eu usei o Prototype JavaScript Framework . Eu tenho duas matrizes com chaves e valores. Eu itero através do loop for e gero uma string JSON válida. Eu uso a função evalJSON () para converter a string JSON em um objeto JavaScript.

Aqui está o código de exemplo. Teste em seu console 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);
Gaurang Jadia
fonte
1
Obrigado cara isso me ajudou muito, usei PARSE.json (jsonstring) em vez de jsonstring.evalJSON (true);
Arnaud Bouchot de
0

Sua pergunta é muito difícil de decodificar, mas vou tentar dar uma olhada nela.

Você diz:

Eu quero criar um objeto json com dois campos uniqueIDofSelecte optionValueem javascript.

E então você diz:

Eu preciso de uma saída como

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

Bem, esta saída de exemplo não tem o campo nomeado uniqueIDofSelect, apenas tem optionValue.

De qualquer forma, você está pedindo uma série de objetos ...

Então, no comentário aos michaels, você diz:

Ele cria um array de objetos json. mas preciso apenas de um objeto json.

Então você não quer uma série de objetos?

O que voce quer entao?

Por favor, decida-se.

Rene Saarsoo
fonte
Primeira coisa: lamento que uniqueIDofSelect == selectID (Id do elemento select, posso manter o id do meu registro como o id do elemento select (para atualização de registro por propósito). Também terei o número do elemento select gerado pelo loop foreach. Na verdade, este loop é que estamos usando em asp.net MVC para exibir objetos Enumerable 2) Você está certo, meu erro que eu estava pensando que toda a saída é um objeto json. Mas é realmente uma matriz de objeto. E então a resposta de Michael é perfeita. Obrigado por apontar.
Vikas