es6 - Cómo convertir un objeto{} en una matriz[] de pares clave-valor en JavaScript
convert object to array typescript (13)
Quiero convertir un objeto como este:
{"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0}
en una matriz de pares clave-valor como este:
[[1,5],[2,7],[3,0],[4,0]...].
¿Cómo puedo convertir un objeto en una matriz de pares clave-valor en JavaScript?
Object.entries()
devuelve una matriz cuyos elementos son matrices correspondientes a los pares de propiedades enumerables[key, value]
encuentran directamente sobre elobject
. El orden de las propiedades es el mismo que el dado al recorrer manualmente los valores de propiedad del objeto.
La función
Object.entries
devuelve casi el resultado exacto que está solicitando, excepto que las teclas son cadenas en lugar de números.
const obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};
console.log(Object.entries(obj));
Si necesita que las claves sean números, puede asignar el resultado a una nueva matriz con una función de devolución de llamada que reemplace la clave en cada par con un número forzado.
const obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};
const toNumericPairs = input => {
const entries = Object.entries(input);
return entries.map(entry => Object.assign(entry, { 0: +entry[0] }));
}
console.log(toNumericPairs(obj));
Utilizo una función de flecha y
Object.assign
para la devolución de llamada del mapa en el ejemplo anterior para poder mantenerlo en una instrucción aprovechando el hecho de que
Object.assign
devuelve el objeto al que se está asignando, y el valor de retorno de una sola función de flecha de instrucción es El resultado de la instrucción.
Esto es equivalente a:
entry => {
entry[0] = +entry[0];
return entry;
}
Como mencionó @TravisClarke en los comentarios, la función de mapa podría acortarse a:
entry => [ +entry[0], entry[1] ]
Sin embargo, eso crearía una nueva matriz para cada par clave-valor, en lugar de modificar la matriz existente en su lugar, duplicando la cantidad de matrices de pares clave-valor creadas. Si bien la matriz de entradas originales aún es accesible, no se recolectarán basura y sus entradas.
Ahora, aunque el uso de nuestro método en el lugar todavía usa dos matrices que contienen los pares clave-valor (las matrices de entrada y salida), el número total de matrices solo cambia en uno. Las matrices de entrada y salida en realidad no están llenas de matrices, sino que las referencias a las matrices y esas referencias ocupan una cantidad insignificante de espacio en la memoria.
- La modificación de cada par clave-valor en el lugar da como resultado una cantidad insignificante de crecimiento de la memoria, pero requiere escribir algunos caracteres más.
- Crear una nueva matriz para cada par clave-valor da como resultado la duplicación de la cantidad de memoria requerida, pero requiere escribir algunos caracteres menos.
Podría ir un paso más allá y eliminar el crecimiento por completo modificando la matriz de entradas en su lugar en lugar de asignarla a una nueva matriz:
const obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};
const toNumericPairs = input => {
const entries = Object.entries(obj);
entries.forEach(entry => entry[0] = +entry[0]);
return entries;
}
console.log(toNumericPairs(obj));
Con lodash, además de la respuesta proporcionada anteriormente, también puede tener la clave en la matriz de salida.
Sin las claves de objeto en la matriz de salida
para:
const array = _.values(obj);
Si obj es el siguiente:
{ “art”: { id: 1, title: “aaaa” }, “fiction”: { id: 22, title: “7777”} }
Entonces la matriz será:
[ { id: 1, title: “aaaa” }, { id: 22, title: “7777” } ]
Con las teclas de objeto en la matriz de salida
Si escribes en su lugar (''género'' es una cadena que eliges):
const array= _.map(obj, (val, id) => {
return { ...val, genre: key };
});
Conseguirás:
[
{ id: 1, title: “aaaa” , genre: “art”},
{ id: 22, title: “7777”, genre: “fiction” }
]
La mejor manera es hacer:
var obj ={"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0}
Object.entries(obj);
Llamar a las
entries
, como se muestra aquí, devolverá pares
[key, value]
, como solicitó el autor de la pregunta.
Alternativamente, puede llamar a
Object.values(obj)
, que devolvería solo valores.
Objeto de conversión recursivo a matriz
function is_object(mixed_var) {
if (mixed_var instanceof Array) {
return false;
} else {
return (mixed_var !== null) && (typeof( mixed_var ) == ''object'');
}
}
function objectToArray(obj) {
var array = [], tempObject;
for (var key in obj) {
tempObject = obj[key];
if (is_object(obj[key])) {
tempObject = objectToArray(obj[key]);
}
array[key] = tempObject;
}
return array;
}
Otra solución más si
Object.entries
no funcionará para usted.
const obj = {
''1'': 29,
''2'': 42
};
const arr = Array.from(Object.keys(obj), k=>[`${k}`, obj[k]]);
console.log(arr);
Para recapitular algunas de estas respuestas ahora en 2018, donde ES6 es el estándar.
Comenzando con el objeto:
let const={"1":9,"2":8,"3":7,"4":6,"5":5,"6":4,"7":3,"8":2,"9":1,"10":0,"12":5};
- Solo obteniendo ciegamente los valores en una matriz, no importa las claves:
const obj={"1":9,"2":8,"3":7,"4":6,"5":5,"6":4,"7":3,"8":2,"9":1,"10":0,"12":5};
console.log(Object.values(obj));
//[9,8,7,6,5,4,3,2,1,0,5]
- Simple obtener los pares en una matriz:
const obj={"1":9,"2":8,"3":7,"4":6,"5":5,"6":4,"7":3,"8":2,"9":1,"10":0,"12":5};
console.log(Object.entries(obj));
//[["1",9],["2",8],["3",7],["4",6],["5",5],["6",4],["7",3],["8",2],["9",1],["10",0],["12",5]]
- Igual que el anterior, pero con teclas numéricas en cada par:
const obj={"1":9,"2":8,"3":7,"4":6,"5":5,"6":4,"7":3,"8":2,"9":1,"10":0,"12":5};
console.log(Object.entries(obj).map(([k,v])=>[+k,v]));
//[[1,9],[2,8],[3,7],[4,6],[5,5],[6,4],[7,3],[8,2],[9,1],[10,0],[12,5]]
- Usar la propiedad del objeto como clave para una nueva matriz (podría crear matrices dispersas):
const obj={"1":9,"2":8,"3":7,"4":6,"5":5,"6":4,"7":3,"8":2,"9":1,"10":0,"12":5};
console.log(Object.entries(obj).reduce((ini,[k,v])=>(ini[k]=v,ini),[]));
//[undefined,9,8,7,6,5,4,3,2,1,0,undefined,5]
Este último método, también podría reorganizar el orden de la matriz según el valor de las claves. A veces, este podría ser el comportamiento deseado (a veces no). Pero la ventaja ahora es que los valores están indexados en la ranura de matriz correcta, esencial y trivial para realizar búsquedas en ella.
- Mapa en lugar de matriz
Finalmente (no es parte de la pregunta original, pero para completar), si necesita buscar fácilmente usando la clave o el valor, pero no desea matrices dispersas, sin duplicados y sin reordenamiento sin la necesidad de convertir a claves numéricas ( incluso puede acceder a claves muy complejas), entonces la matriz (u objeto) no es lo que necesita.
Recomendaré
Map
lugar:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
let r=new Map(Object.entries(obj));
r.get("4"); //6
r.has(8); //true
Puede usar
Object.keys()
y
map()
para hacer esto
var obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0}
var result = Object.keys(obj).map(function(key) {
return [Number(key), obj[key]];
});
console.log(result);
Si está usando lodash, podría ser tan simple como esto:
var obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};
var res = Object.entries(obj);
console.log(res);
Usar para en
var obj = { "10":5, "2":7, "3":0, "4":0, "5":0, "6":0, "7":0,
"8":0, "9":0, "10":0, "11":0, "12":0 };
var objectToArray = function(obj) {
var _arr = [];
for (var key in obj) {
_arr.push([key, obj[key]]);
}
return _arr;
}
console.log(objectToArray(obj));
Use
Object.entries
para obtener cada elemento de Object en formato de
key & value
, luego haga un
map
través de ellos de esta manera:
var obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0}
var res = Object.entries(obj).map(([k, v]) => ([Number(k), v]));
console.log(res);
Pero, si está seguro de que las teclas estarán en
orden progresivo
, puede usar
Object.values
y
map
para hacer algo como esto:
var obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};
// idx is the index, you can use any logic to increment it (starts from 0)
let result = Object.values(obj).map((e, idx) => ([++idx, e]));
console.log(result);
Use
Object.keys
y
map()
métodos de
map()
.
var obj = {
"1": 5,
"2": 7,
"3": 0,
"4": 0,
"5": 0,
"6": 0,
"7": 0,
"8": 0,
"9": 0,
"10": 0,
"11": 0,
"12": 0
};
// get all object property names
var res = Object.keys(obj)
// iterate over them and generate the array
.map(function(k) {
// generate the array element
return [+k, obj[k]];
});
console.log(res);
puedes usar _.castArray(obj) .
ejemplo:
_.castArray({ ''a'': 1 }); // => [{ ''a'': 1 }]
_.castArray({ ''a'': 1 }); // => [{ ''a'': 1 }]