Convertir objetos JavaScript con teclas numéricas en una matriz

175

Tengo un objeto como este que regresa como una respuesta JSON del servidor:

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

Quiero convertirlo en una matriz de JavaScript como esta:

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

¿Hay una mejor manera de hacer esto? Dondequiera que estoy leyendo, la gente usa una lógica compleja usando bucles. Entonces, ¿hay métodos alternativos para hacer esto?

Nikhil Agrawal
fuente
3
duplicado: stackoverflow.com/questions/6857468/…
BENARD Patrick
8
Un simple bucle no es una lógica compleja , por cierto
:)

Respuestas:

328

En realidad es muy sencillo con jQuery's $.map

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

VIOLÍN

y casi tan fácil sin jQuery también, convirtiendo las claves en una matriz y luego mapeando los valores con Array.map

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

VIOLÍN

Asumiendo que ya está analizado como un objeto javascript, y que en realidad no es JSON, que es un formato de cadena, en ese caso también JSON.parsesería necesario analizarlo.

En ES2015 hay Object.valuesque rescatar, lo que hace que sea muy fácil

var arr = Object.values(obj);
adeneo
fuente
1
@adeneo Señor, ¿puede dar alguna explicación sobre estos métodos?
Nikhil Agrawal
1
@adeneo aka Mr. Burns ... Gracias por esta rápida solución.
Dzeimsas Zvirblis
1
@NikhilAgrawal El truco aquí es usar Object.keys (), que devuelve las claves del objeto (= sus propias propiedades enumerables) como una matriz . Entonces podemos usar array.map para reemplazar cada clave por el valor correspondiente en una nueva matriz.
antoine
1
Esta es una respuesta, pero no muy amigable.
sheriffderek
1
La pregunta no era explícita, pero supuse que las claves del objeto son índices de la matriz por naturaleza (0,1,2,3). Simplemente señalando que la gente debería saber que este método no garantiza ningún orden en la matriz; si las claves son índices, entonces debe ordenarlas explícitamente para que la matriz se construya en el orden correcto.
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 esto es lo que buscas!

benhowdle89
fuente
Gracias. Realmente necesitaba eso. alguien utiliza un objeto como una matriz a través de una tonelada de código, que estaba bien hasta que necesitaba para construir encima de ella ...
Amanda Fouts
¡Gracias! Respuesta perfecta.
Vincent
muy cerca de lo que necesitaba gracias: for (var x en datos) {arr [x] = datos [x]; }
Andrew
24

Simplemente lo haces 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);

MANIFESTACIÓN

Satpal
fuente
20

No hay nada como un "objeto JSON": JSON es una notación de serialización.

Si desea transformar su objeto javascript en una matriz javascript , escriba su propio bucle [que no sería tan complejo], o confíe en el método underscore.js _.toArray() :

var obj = {"0":"1","1":"2","2":"3","3":"4"};
var yourArray = _(obj).toArray();
moonwave99
fuente
1
Gracias, funciona a las mil maravillas. Pero, ¿cómo hacer que haga lo mismo para los objetos internos también (objetos dentro de los objetos)? Los objetos internos también deberían convertirse en miembros planos de la matriz en el nivel raíz (para que puedan pasarse a, por ejemplo, datatables.net, etc.)
Gopalakrishna Palem
+1: "No hay nada como un" objeto JSON ": JSON es una notación de serialización". - No puedo creer cuántas veces tuve que escuchar esto antes de entenderlo completamente.
radbyx
9

Nada difícil aquí. Recorra los elementos de su objeto y asígnelos a la 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
fuente
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)

MANIFESTACIÓN

Tareq Salah
fuente
4

Prueba esto:

var newArr = [];
$.each(JSONObject.results.bindings, function(i, obj) {
    newArr.push([obj.value]);
});
Dev afgano
fuente
Su solución será la más lenta de todas las presentadas aquí ... Malo para el código comercial;)
HellBaby
3
var obj = {"0":"1","1":"2","2":"3","3":"4"};

var vals = Object.values(obj);

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

Otra alternativa a la pregunta.

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

Usando javascript sin procesar, suponga que tiene:

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

Puede obtener los valores con:

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

Salida:

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

No estoy seguro de lo que me falta aquí, pero simplemente intentar el siguiente código hace el trabajo. ¿Me estoy perdiendo algo aquí?

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

Asumiendo que tiene un valor como el siguiente

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

Luego puede convertir esto en una matriz de JavaScript utilizando lo siguiente

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

Esto funciona para convertir json en matrices javascript multidireccionales también.

Ninguno de los otros métodos en esta página parecía funcionar completamente para mí cuando trabajaba con cadenas codificadas por php json, excepto el método que menciono aquí.

skidadon
fuente
1

Aquí hay un ejemplo de cómo podría obtener una matriz de objetos y luego ordenar la matriz.

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

Esta es la mejor solución. Creo que sí.

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

      data  = {{ jdata|safe }}; //parse through js
      var i = 0 ;
      for (i=0;i<data.length;i++){
         data[i] = data[i].value;
      }
juego cz
fuente
2
Gracias por este fragmento de código, que puede proporcionar una ayuda limitada e inmediata. Una explicación adecuada mejoraría en gran medida su valor a largo plazo al mostrar por qué esta es una buena solución al problema y lo haría más útil para futuros lectores con otras preguntas similares. Por favor, editar su respuesta a añadir un poco de explicación, incluyendo los supuestos realizados.
Mogsdad
0

Puede convertir json Object en 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
fuente
La pregunta es sobre JavaScript, no PHP.
Charles Taylor
-1

Puede usar Object.assign()un literal de matriz vacío []como target:

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

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

console.log(output)

Si marca el polyfill , Object.assign(target, ...sources)solo copia todas las propiedades propias enumerables de los sourceobjetos a un objeto de destino. Si targetes una matriz, agregará las claves numéricas al literal de la matriz y devolverá ese targetobjeto de la matriz.

adiga
fuente