Convertendo objeto JavaScript com chaves numéricas em matriz

175

Eu tenho um objeto como este voltando como uma resposta JSON do servidor:

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

Quero convertê-lo em uma matriz JavaScript como esta:

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

Existe a melhor maneira de fazer isso? Onde quer que eu esteja lendo, as pessoas estão usando lógica complexa usando loops. Então, existem métodos alternativos para fazer isso?

Nikhil Agrawal
fonte
3
duplicado: stackoverflow.com/questions/6857468/…
BENARD Patrick
8
Um simples circuito há lógica complexa , pelo caminho:))
moonwave99

Respostas:

328

Na verdade, é muito direto com o jQuery $.map

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

FIDDLE

e quase tão fácil sem o jQuery, como converter as chaves em uma matriz e, em seguida, mapear os valores com Array.map

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

FIDDLE

Isso pressupõe que ele já foi analisado como um objeto javascript e não é realmente JSON, que é um formato de string, nesse caso, uma execução JSON.parsetambém seria necessária.

No ES2015 há Object.valueso resgate, o que torna isso uma brisa

var arr = Object.values(obj);
adeneo
fonte
1
@adeneo Senhor, você pode fornecer algumas explicações sobre os métodos htis.
Nikhil Agrawal
1
@adeneo aka Mr. Burns ... Obrigado por esta solução rápida.
Dzeimsas Zvirblis
1
@NikhilAgrawal O truque aqui é usar Object.keys (), que retorna as chaves do objeto (= suas próprias propriedades enumeráveis) como uma matriz . Em seguida, podemos usar o array.map para substituir cada chave pelo valor correspondente em um novo array.
precisa
1
Esta é uma resposta, mas não muito amigável.
Sheriffderek
1
A questão não era explícita, mas eu assumi que as chaves do objeto são índices da matriz por natureza (0,1,2,3). Apenas salientando que as pessoas devem saber que esse método não garante nenhuma ordem na matriz; se as chaves forem índices, você precisará solicitá-las explicitamente para que a matriz seja criada na ordem correta.
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]);
}

Espero que seja isso que você procura!

benhowdle89
fonte
obrigado. realmente precisava disso. alguém usou um objeto como uma matriz ao longo de uma tonelada de código, que estava bem até que eu precisava para construir em cima dela ...
amanda Fouts
Obrigado! Resposta perfeita.
Vincent
muito perto do que eu precisava, graças: for (var x in data) {arr [x] = data [x]; }
Andrew
24

Você simplesmente faz como

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

DEMO

Satpal
fonte
20

Não há nada como um "objeto JSON" - JSON é uma notação de serialização.

Se você deseja transformar seu objeto javascript em uma matriz javascript , escreva seu próprio loop [que não seria tão complexo!] Ou use o _.toArray() método underscore.js :

var obj = {"0":"1","1":"2","2":"3","3":"4"};
var yourArray = _(obj).toArray();
moonwave99
fonte
1
Obrigado - funciona como charme. Mas como fazer o mesmo com objetos internos também (objetos dentro de objetos)? Objetos internos também deve tornar-se membros planas da matriz no nível raiz (para que eles possam ser passados para, digamos, datatables.net etc.)
Gopalakrishna Palem
+1: "Não há nada como um" objeto JSON "- JSON é uma notação de serialização". - Não acredito quantas vezes tive que ouvir isso antes de entender completamente.
Radbyx #
9

Nada difícil aqui. Passe pelos elementos do objeto e atribua-os à matriz

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
fonte
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)

DEMO

Tareq Salah
fonte
4

Tente o seguinte:

var newArr = [];
$.each(JSONObject.results.bindings, function(i, obj) {
    newArr.push([obj.value]);
});
Afghan Dev
fonte
Sua solução vai ser o mais lento de todos aqui apresentado ... Bad para o código de negócio;)
HellBaby
3
var obj = {"0":"1","1":"2","2":"3","3":"4"};

var vals = Object.values(obj);

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

Outra alternativa para a questão

var vals = Object.values(JSON.parse(obj)); //where json needs to be parsed
ASM
fonte
2

Usando javascript bruto, suponha que você tenha:

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

Você pode obter os valores com:

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

Resultado:

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

Não tenho certeza do que estou perdendo aqui, mas simplesmente tentando o código abaixo faz o trabalho. Estou perdendo alguma coisa aqui?

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
fonte
1

Supondo que você tenha um valor como o seguinte

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

Em seguida, você pode transformar isso em uma matriz javascript usando o seguinte

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

Isso funciona para converter json em matrizes javascript multi-dimensionais também.

Nenhum dos outros métodos nesta página pareceu funcionar completamente para mim ao trabalhar com strings codificadas em php json, exceto o método que estou mencionando aqui.

skidadon
fonte
1

Aqui está um exemplo de como você pode obter uma matriz de objetos e depois classificá-la.

  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
fonte
0

Esta é a melhor solução. Acho que sim.

Object.keys(obj).map(function(k){return {key: k, value: obj[k]}})
tutaro
fonte
0
      var data = [];

      data  = {{ jdata|safe }}; //parse through js
      var i = 0 ;
      for (i=0;i<data.length;i++){
         data[i] = data[i].value;
      }
jogo cz
fonte
2
Obrigado por este trecho de código, que pode fornecer ajuda imediata e limitada. Uma explicação adequada melhoraria bastante seu valor a longo prazo , mostrando por que essa é uma boa solução para o problema e a tornaria mais útil para futuros leitores com outras perguntas semelhantes. Por favor edite sua resposta para adicionar alguma explicação, incluindo as suposições que você fez.
Mogsdad
0

Você pode converter json Object em Array & String usando 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
fonte
A questão é sobre javascript, não PHP.
Charles Taylor
-1

Você pode usar Object.assign()com uma matriz vazia literal []como target:

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

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

console.log(output)

Se você marcar o polyfill , Object.assign(target, ...sources)copie todas as propriedades próprias enumeráveis ​​dos sourceobjetos para um objeto de destino. Se targetfor uma matriz, ela adicionará as chaves numéricas ao literal da matriz e retornará esse targetobjeto de matriz.

adiga
fonte