Comment créer json par JavaScript for loop?

99

J'ai un tableau de balises sélectionnées.

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

et je veux créer un objet json ayant deux champs «uniqueIDofSelect et optionValue» en JavaScript.

J'utilise getElementsByName ("status") et j'y itère.

ÉDITER

J'ai besoin de sortir comme

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

etc...

Vikas
la source
Je suppose que optionValue doit être l'attribut «value» de chaque élément «option»: 1, 2, etc. Mais quel est l'ID? Est-ce le texte? «Présent», «Absent», etc.?
PAUSE système
D'accord, donc si ID est l'uniqueID de la sélection, il ne peut y avoir qu'une seule optionValue, non? Je suppose que vous voulez la sélection actuelle, et non un tableau de toutes les sélections?
PAUSE système

Réponses:

174

D'après ce que je comprends de votre demande, cela devrait fonctionner:

<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
la source
41
JSON est un objet et non un tableau.
Gumbo
Il crée un tableau d'objets json. mais j'ai besoin d'un seul objet json.
Vikas
1
Vous n'avez pas à déclarer un tableau comme var jsonObj = new Array (); cuz votre exemple n'a pas fonctionné pour moi. Lorsque je passe à nouveau Array (), cela fonctionne.
Meow
18
var jsonArr = [];crée un nouveau tableau. var jsonObj = {};crée un nouvel objet
b_dubb
Donc, question stupide, je connais la différence entre un tableau d'objets et un objet qui contient un tableau d'objets (à peu près, la différence entre jsonArr = []et jsonObj = {}dans ce post). J'ai, peut-être trop souvent, et peut-être même à tort, fait référence à un objet qui contient un tableau d'objets qui contiennent chacun des paires nom / valeur (éventuellement différentes) comme un "objet JSON". Étant familier avec la syntaxe JSON simple (comme ce que vous auriez dans un .jsonfichier réel ), je sais que la syntaxe est différente. Alors, feriez-vous également référence au tableau d'objets comme 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
la source
8

Si vous voulez un seul objet JavaScript tel que le suivant:

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

(où l'option 2, "Absent", est la sélection actuelle), le code suivant devrait la produire:

  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 vous voulez un tableau de tous ces objets (pas seulement celui sélectionné), utilisez le code de Michael mais remplacez-le status.options[i].textpar status.id.

Si vous voulez une chaîne qui contient une représentation JSON de l'objet sélectionné, utilisez plutôt ceci:

  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;
     }
  }
PAUSE système
la source
3

Si je veux créer un objet JavaScript à partir d'une chaîne générée par une boucle for, j'utiliserais une approche JSON vers objet. Je générerais une chaîne JSON en itérant pour la boucle, puis j'utiliserais n'importe quel framework JavaScript populaire pour évaluer JSON en objet.

J'ai utilisé Prototype JavaScript Framework . J'ai deux tableaux avec des clés et des valeurs. Je parcours la boucle for et génère une chaîne JSON valide. J'utilise la fonction evalJSON () pour convertir une chaîne JSON en objet JavaScript.

Voici un exemple de code. Essayez sur votre 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
la source
1
Merci mec, cela m'a beaucoup aidé, j'ai utilisé PARSE.json (jsonstring) au lieu de jsonstring.evalJSON (true);
Arnaud Bouchot
0

Votre question est assez difficile à décoder, mais je vais essayer d'y répondre.

Vous dites:

Je veux créer un objet json ayant deux champs uniqueIDofSelectet optionValueen javascript.

Et puis vous dites:

J'ai besoin d'une sortie comme

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

Eh bien, cet exemple de sortie n'a pas le champ nommé uniqueIDofSelect, il l'a seulement optionValue.

Quoi qu'il en soit, vous demandez un tableau d'objets ...

Ensuite, dans le commentaire à Michael, vous dites:

Il crée un tableau d'objets json. mais j'ai besoin d'un seul objet json.

Vous ne voulez donc pas un tableau d'objets?

Que voulez-vous alors?

Veuillez vous décider.

René Saarsoo
la source
Première chose: désolé que uniqueIDofSelect == selectID (Id de l'élément select, je peux conserver l'identifiant de mon enregistrement comme identifiant d'élément select (pour la mise à jour de l'enregistrement). J'aurai également le nombre d'élément select généré par la boucle foreach. En fait, cette boucle est que nous utilisons dans asp.net MVC pour afficher des objets énumérables.2) Vous avez raison, mon erreur en m'amusant que toute la sortie est un objet json. Mais c'est en fait un tableau d'objets. Et la réponse de Michael est donc parfaite. Merci d'avoir signalé.
Vikas