¿Cómo crear json por JavaScript para bucle?

99

Tengo una matriz de etiqueta de selección.

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

y quiero crear un objeto json que tenga dos campos 'uniqueIDofSelect y optionValue' en JavaScript.

Yo uso getElementsByName ("status") y lo repito.

EDITAR

Necesito ponerme como

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

y así...

Vikas
fuente
Supongo que optionValue debería ser el atributo 'valor' de cada elemento de 'opción': 1, 2, etc. Pero, ¿cuál es el ID? ¿Es el texto? ¿"Presente", "Ausente", etc.?
PAUSA del sistema
Bien, entonces si ID es el ID único de la selección, entonces solo puede haber un optionValue, ¿verdad? Supongo que desea la selección actual y no una matriz de todas las selecciones.
PAUSA del sistema

Respuestas:

174

Por lo que entiendo de su solicitud, esto debería 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
fuente
41
JSON es un objeto y no una matriz.
Gumbo
Crea una matriz de objetos json. pero solo necesito un objeto json.
Vikas
1
¿No tienes que declarar una matriz como var jsonObj = new Array (); porque tu ejemplo no funcionó para mí. Cuando cambio a new Array (), entonces funciona.
Miau
18
var jsonArr = [];crea una nueva matriz. var jsonObj = {};crea un nuevo objeto
b_dubb
Entonces, pregunta tonta, sé la diferencia entre una matriz de objetos y un objeto que contiene una matriz de objetos (prácticamente, la diferencia entre jsonArr = []y jsonObj = {}en esta publicación). Quizás con demasiada frecuencia, y quizás incluso erróneamente, me he referido a un objeto que contiene una matriz de objetos que cada uno tiene pares de nombre / valor (posiblemente diferentes) como un "objeto JSON". Al estar familiarizado con la sintaxis JSON simple (como la que tendría en un .jsonarchivo real ), sé que sintácticamente esto es diferente. Entonces, ¿también se referiría a la matriz de objetos como 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;
}
Josh Stodola
fuente
8

Si desea un único objeto de JavaScript como el siguiente:

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

(donde la opción 2, "Ausente", es la selección actual), el siguiente código debería producirla:

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

Si desea una matriz de todos esos objetos (no solo el seleccionado), use el código de Michael pero cámbielo status.options[i].textpor status.id.

Si desea una cadena que contenga una representación JSON del objeto seleccionado, use esto en su lugar:

  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 del sistema
fuente
3

Si quiero crear un objeto JavaScript a partir de una cadena generada por el bucle for, entonces usaría un enfoque JSON a objeto. Generaría una cadena JSON iterando para el bucle y luego usaría cualquier marco de JavaScript popular para evaluar JSON a Object.

He usado Prototype JavaScript Framework . Tengo dos matrices con claves y valores. Repito el bucle for y genero una cadena JSON válida. Yo uso evalJSON () función para convertir a cadena JSON objeto de JavaScript.

Aquí hay un código de ejemplo. Prueba en tu consola 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
fuente
1
Gracias tío, me ha ayudado mucho, he usado PARSE.json (jsonstring) en lugar de jsonstring.evalJSON (true);
Arnaud Bouchot
0

Tu pregunta es bastante difícil de descifrar, pero intentaré intentarlo.

Tu dices:

Quiero crear un objeto json que tenga dos campos uniqueIDofSelecty optionValueen javascript.

Y luego dices:

Necesito salida como

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

Bueno, esta salida de ejemplo no tiene el campo nombrado uniqueIDofSelect, solo tiene optionValue.

De todos modos, estás pidiendo una variedad de objetos ...

Luego, en el comentario a la respuesta de michaels, dices:

Crea una matriz de objetos json. pero solo necesito un objeto json.

¿Entonces no quieres una matriz de objetos?

¿Entonces que quieres?

Por favor decídete.

Rene Saarsoo
fuente
Lo primero: lo siento, uniqueIDofSelect == selectID (Id del elemento seleccionado, puedo mantener el id de mi registro como id del elemento seleccionado (para el propósito de actualización del registro). También tendré el número de elementos seleccionados generados por el bucle foreach. En realidad, este bucle es que estamos usando en asp.net MVC para mostrar objetos enumerables 2) Tienes razón, mi error fue que me estaba divirtiendo que toda la salida es un objeto json. Pero en realidad es una matriz de objetos. Y entonces la respuesta de Michael es perfecta. Gracias por señalar.
Vikas