Jak stworzyć pętlę JSON przez JavaScript?

99

Mam tablicę wybranych tagów.

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

i chcę utworzyć obiekt json mający dwa pola „uniqueIDofSelect i optionValue” w JavaScript.

Używam getElementsByName („status”) i wykonuję iterację.

EDYTOWAĆ

Muszę wyjść jak

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

i tak dalej...

Vikas
źródło
Zakładam, że optionValue powinno być atrybutem „value” każdego elementu „option”: 1, 2 itd. Ale jaki jest identyfikator? Czy to tekst? „Obecny”, „Nieobecny” itp.?
system PAUSE
Okay, więc jeśli ID jest unikalnym identyfikatorem selekcji, to może być tylko jedna opcjaValue, prawda? Przypuszczam, że chcesz mieć bieżący wybór, a nie tablicę wszystkich wyborów?
system PAUSE

Odpowiedzi:

174

Z tego, co rozumiem z Twojej prośby, powinno to zadziałać:

<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
źródło
41
JSON to obiekt, a nie tablica.
Gumbo
Tworzy tablicę obiektów JSON. ale potrzebuję tylko jednego obiektu json.
Vikas
1
Nie musisz deklarować tablicy, takiej jak var jsonObj = new Array (); ponieważ twój przykład nie zadziałał dla mnie. Kiedy zmieniam na nową Array (), to działa.
Meow
18
var jsonArr = [];tworzy nowy Array. var jsonObj = {};tworzy nowy obiekt
b_dubb
Więc, głupie pytanie, znam różnicę między tablicą obiektów a obiektem, który zawiera tablicę obiektów (w przybliżeniu różnica między jsonArr = []iw jsonObj = {}tym poście). Być może zbyt często, a może nawet błędnie, odnosiłem się do obiektu zawierającego tablicę obiektów, z których każdy zawiera (prawdopodobnie różne) pary nazwa / wartość jako „obiekt JSON”. Znając prostą składnię JSON (taką, jaką miałbyś w rzeczywistym .jsonpliku), wiem, że składniowo jest inaczej. Czy możesz nazywać tablicą obiektów również 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
źródło
8

Jeśli potrzebujesz jednego obiektu JavaScript, takiego jak następujący:

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

(gdzie opcja 2, „Brak”, to aktualny wybór), to powinien ją wygenerować następujący kod:

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

Jeśli chcesz mieć tablicę wszystkich takich obiektów (nie tylko zaznaczonego), użyj kodu Michaela, ale zamień status.options[i].textna status.id.

Jeśli chcesz ciąg znaków zawierający reprezentację JSON wybranego obiektu, użyj tego zamiast tego:

  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;
     }
  }
system PAUSE
źródło
3

Jeśli chcę utworzyć obiekt JavaScript z ciągu wygenerowanego przez pętlę for, chciałbym podejście JSON do Object. Wygenerowałbym ciąg JSON przez iterację pętli for, a następnie użyłbym dowolnego popularnego środowiska JavaScript do oceny JSON do obiektu.

Użyłem Prototype JavaScript Framework . Mam dwie tablice z kluczami i wartościami. Iteruję przez pętlę for i generuję prawidłowy ciąg JSON. Używam funkcji evalJSON () do konwersji łańcucha JSON na obiekt JavaScript.

Oto przykładowy kod. Wypróbuj na konsoli 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
źródło
1
Dzięki stary, bardzo mi pomogło. Użyłem PARSE.json (jsonstring) zamiast jsonstring.evalJSON (true);
Arnaud Bouchot
0

Twoje pytanie jest dość trudne do rozszyfrowania, ale spróbuję go zadać.

Mówisz:

Chcę utworzyć obiekt json mający dwa pola uniqueIDofSelecti optionValuejavascript.

A potem mówisz:

Potrzebuję wyjścia jak

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

Cóż, to przykładowe wyjście nie ma pola o nazwie uniqueIDofSelect, ma tylko optionValue.

W każdym razie pytasz o tablicę obiektów ...

Następnie w komentarzu do Michaelsa odpowiadasz:

Tworzy tablicę obiektów JSON. ale potrzebuję tylko jednego obiektu json.

Więc nie chcesz tablicy obiektów?

Czego więc chcesz?

Proszę, zdecyduj się.

Rene Saarsoo
źródło
Pierwsza sprawa: przepraszam, że uniqueIDofSelect == selectID (Id elementu select, mogę zachować id mojego rekordu jako id elementu select (dla aktualizacji rekordu perpose). Będę też miał liczbę elementów select wygenerowanych przez pętlę foreach. Właściwie ta pętla jest których używamy w asp.net MVC do wyświetlania obiektów Enumerable.2) Masz rację, mój błąd, że byłem zabawny, że całe wyjście to jeden obiekt json. Ale w rzeczywistości jest to tablica obiektów. A więc odpowiedź Michaela jest doskonała. Dzięki za zwrócenie uwagi.
Vikas