Konwersja obiektu JavaScript z kluczami numerycznymi na tablicę

175

Mam taki obiekt, który wraca jako odpowiedź JSON z serwera:

{"0":"1","1":"2","2":"3","3":"4"}

Chcę przekonwertować go na tablicę JavaScript, taką jak ta:

["1","2","3","4"]

Czy jest na to najlepszy sposób? Gdziekolwiek czytam, ludzie używają złożonej logiki za pomocą pętli. Czy są więc alternatywne metody, aby to zrobić?

Nikhil Agrawal
źródło
3
duplicate: stackoverflow.com/questions/6857468/ ...
BENARD Patrick
8
Nawiasem mówiąc,

Odpowiedzi:

328

W rzeczywistości jest to bardzo proste w przypadku jQuery $.map

var arr = $.map(obj, function(el) { return el });

SKRZYPCE

i prawie tak łatwo bez jQuery, konwertowanie kluczy do tablicy, a następnie odwzorowywanie wartości za pomocą Array.map

var arr = Object.keys(obj).map(function(k) { return obj[k] });

SKRZYPCE

To przy założeniu, że jest już przeanalizowany jako obiekt javascript i nie jest w rzeczywistości JSON, który jest formatem ciągów znaków, w takim przypadku JSON.parsekonieczne byłoby również uruchomienie .

W ES2015 jest Object.valuesna ratunek, co sprawia, że ​​jest to pestka

var arr = Object.values(obj);
adeneo
źródło
1
@adeneo Proszę pana, czy może Pan wyjaśnić te metody.
Nikhil Agrawal
1
@adeneo aka Mr. Burns ... Dzięki za to szybkie rozwiązanie.
Dzeimsas Zvirblis
1
@NikhilAgrawal Sztuczka polega na tym, aby użyć Object.keys (), która zwraca klucze obiektu (= jego własne wyliczalne właściwości) jako tablicę . Następnie możemy użyć array.map do zastąpienia każdego klucza odpowiednią wartością w nowej tablicy.
antoine
1
To jest odpowiedź, ale niezbyt przyjazna.
szeryfderek
1
Pytanie nie było jasne, ale założyłem, że klucze obiektu są indeksami tablicy z natury ich wartości (0,1,2,3). Zwracam tylko uwagę, że ludzie powinni wiedzieć, że ta metoda nie gwarantuje żadnego porządku w tablicy; jeśli klucze są indeksami, musisz jawnie je uporządkować, aby tablica została zbudowana we właściwej kolejności.
leejt489
107
var json = '{"0":"1","1":"2","2":"3","3":"4"}';

var parsed = JSON.parse(json);

var arr = [];

for(var x in parsed){
  arr.push(parsed[x]);
}

Mam nadzieję, że właśnie tego szukasz!

benhowdle89
źródło
dzięki. naprawdę tego potrzebowałem. ktoś użył obiektu jako tablicy w całej masie kodu, co było w porządku, dopóki nie musiałem go zbudować ...
amanda mówi
Dziękuję Ci! Doskonała odpowiedź.
Vincent
bardzo blisko tego, czego potrzebowałem, dzięki: za (var x in data) {arr [x] = data [x]; }
Andrew
24

Po prostu robisz to jak

var data = {
    "0": "1",
    "1": "2",
    "2": "3",
    "3": "4"
};
var arr = [];
for (var prop in data) {
    arr.push(data[prop]);
}
console.log(arr);

PRÓBNY

Satpal
źródło
20

Nie ma to jak „obiekt JSON” - JSON to notacja serializacji.

Jeśli chcesz zmienić swój obiekt JavaScript do tablicy javascript , albo napisać własną pętlę [co nie byłoby to skomplikowane!], Lub polegać na underscore.js _.toArray() metody:

var obj = {"0":"1","1":"2","2":"3","3":"4"};
var yourArray = _(obj).toArray();
moonwave99
źródło
1
Dzięki - działa jak urok. Ale jak sprawić, by robił to samo również dla obiektów wewnętrznych (obiektów w obiektach)? Obiekty wewnętrzne powinny również stać się płaskimi elementami tablicy na poziomie głównym (aby można je było przekazać, powiedzmy, datatables.net itp.)
Gopalakrishna Palem
+1: „Nie ma to jak„ obiekt JSON ”- JSON to notacja serializacji.” - Nie mogę uwierzyć, ile razy musiałem to usłyszeć, zanim w pełni to zrozumiałem.
radbyx
9

Nie ma tu nic trudnego. Zapętlaj elementy obiektu i przypisz je do tablicy

var obj = {"0":"1","1":"2","2":"3","3":"4"};
var arr = [];
for (elem in obj) {
   arr.push(obj[elem]);
}

http://jsfiddle.net/Qq2aM/

EoiFirst
źródło
9

var JsonObj = {
  "0": "1",
  "1": "2",
  "2": "3",
  "3": "4"
};

var array = [];
for (var i in JsonObj) {
  if (JsonObj.hasOwnProperty(i) && !isNaN(+i)) {
    array[+i] = JsonObj[i];
  }
}

console.log(array)

PRÓBNY

Tareq Salah
źródło
4

Spróbuj tego:

var newArr = [];
$.each(JSONObject.results.bindings, function(i, obj) {
    newArr.push([obj.value]);
});
Afghan Dev
źródło
Twoje rozwiązanie będzie najwolniejsze ze wszystkich przedstawionych tutaj ... Złe dla kodu biznesowego;)
HellBaby
3
var obj = {"0":"1","1":"2","2":"3","3":"4"};

var vals = Object.values(obj);

console.log(vals); //["1", "2", "3", "4"]

Kolejna alternatywa dla pytania

var vals = Object.values(JSON.parse(obj)); //where json needs to be parsed
JAKO M
źródło
2

Używając surowego javascript, załóżmy, że masz:

var j = {0: "1", 1: "2", 2: "3", 3: "4"};

Możesz uzyskać wartości za pomocą:

Object.keys(j).map(function(_) { return j[_]; })

Wynik:

["1", "2", "3", "4"]
mvallebr
źródło
2

Nie jestem pewien, czego tu brakuje, ale po prostu wypróbowanie poniższego kodu działa. Czy coś mi tu brakuje?

https://jsfiddle.net/vatsalpande/w3ew5bhq/

$(document).ready(function(){

var json = {
   "code" :"1", 
   "data" : { 
    "0" : {"id":"1","score":"44"},
    "1" : {"id":"1","score":"44"}
    }
  };

  createUpdatedJson();

  function createUpdatedJson(){

    var updatedJson = json;

    updatedJson.data = [updatedJson.data];

    $('#jsondata').html(JSON.stringify(updatedJson));


    console.log(JSON.stringify(updatedJson));
  }
 })
Vatsal
źródło
1

Zakładając, że masz wartość taką jak poniżej

var obj = {"0":"1","1":"2","2":"3","3":"4"};

Następnie możesz przekształcić to w tablicę javascript za pomocą następującego

var arr = [];
json = JSON.stringify(eval('(' + obj + ')')); //convert to json string
arr = $.parseJSON(json); //convert to javascript array

Działa to również w przypadku konwersji json do wielowymiarowych tablic javascript.

Żadna z innych metod na tej stronie nie wydawała się działać całkowicie dla mnie podczas pracy z ciągami znaków zakodowanymi w php json, z wyjątkiem metody, o której tutaj wspominam.

skidadon
źródło
1

Oto przykład, w jaki sposób można uzyskać tablicę obiektów, a następnie posortować tablicę.

  function osort(obj)
  {  // map the object to an array [key, obj[key]]
    return Object.keys(obj).map(function(key) { return [key, obj[key]] }).sort(
      function (keya, keyb)
      { // sort(from largest to smallest)
          return keyb[1] - keya[1];
      }
    );
  }
Asher
źródło
0

To najlepsze rozwiązanie. Chyba tak.

Object.keys(obj).map(function(k){return {key: k, value: obj[k]}})
tutaro
źródło
0
      var data = [];

      data  = {{ jdata|safe }}; //parse through js
      var i = 0 ;
      for (i=0;i<data.length;i++){
         data[i] = data[i].value;
      }
gra cz
źródło
2
Dziękujemy za ten fragment kodu, który może zapewnić ograniczoną, natychmiastową pomoc. Właściwe wyjaśnienie byłoby znacznie poprawić swoją długoterminową wartość pokazując dlaczego jest to dobre rozwiązanie problemu, a byłoby bardziej użyteczne dla czytelników przyszłości z innymi, podobnymi pytaniami. Proszę edytować swoją odpowiedź dodać kilka wyjaśnień, w tym założeń już wykonanych.
Mogsdad
0

Możesz przekonwertować obiekt json na Array & String za pomocą PHP.

$data='{"resultList":[{"id":"1839","displayName":"Analytics","subLine":""},{"id":"1015","displayName":"Automation","subLine":""},{"id":"1084","displayName":"Aviation","subLine":""},{"id":"554","displayName":"Apparel","subLine":""},{"id":"875","displayName":"Aerospace","subLine":""},{"id":"1990","displayName":"Account Reconciliation","subLine":""},{"id":"3657","displayName":"Android","subLine":""},{"id":"1262","displayName":"Apache","subLine":""},{"id":"1440","displayName":"Acting","subLine":""},{"id":"710","displayName":"Aircraft","subLine":""},{"id":"12187","displayName":"AAC","subLine":""}, {"id":"20365","displayName":"AAT","subLine":""}, {"id":"7849","displayName":"AAP","subLine":""}, {"id":"20511","displayName":"AACR2","subLine":""}, {"id":"28585","displayName":"AASHTO","subLine":""}, {"id":"45191","displayName":"AAMS","subLine":""}]}';

$b=json_decode($data);

$i=0;
while($b->{'resultList'}[$i])
{
    print_r($b->{'resultList'}[$i]->{'displayName'});
    echo "<br />";
    $i++;
}
Manav Akela
źródło
Pytanie dotyczy javascript, a nie PHP.
Charles Taylor
-1

Możesz użyć Object.assign()z pustym literałem tablicy []jako target:

const input = {
  "0": "1",
  "1": "2",
  "2": "3",
  "3": "4"
}

const output = Object.assign([], input)

console.log(output)

Jeśli zaznaczysz wypełnienie , Object.assign(target, ...sources)po prostu skopiuje wszystkie wyliczalne własne właściwości z sourceobiektów do obiektu docelowego. Jeśli targetjest tablicą, doda klucze numeryczne do literału tablicy i zwróci ten targetobiekt tablicy.

adiga
źródło