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?
javascript
arrays
type-conversion
Soptareanu Alex
fuente
fuente
NaN
en su lugar. Si desea usar cadenas como sus claves, cambie el retorno de[Number(key), obj[key]]
a[key, obj[key]]
o useObject.entries
como sugirió @Pila en su respuestaLa mejor manera es hacer:
Llamar
entries
, como se muestra aquí, devolverá[key, value]
pares, como solicitó el autor de la pregunta.Alternativamente, puede llamar
Object.values(obj)
, lo que devolvería solo valores.fuente
La
Object.entries
función devuelve casi el resultado exacto que está solicitando, excepto que las teclas son cadenas en lugar de números.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.
Utilizo una función de flecha y
Object.assign
para la devolución de llamada del mapa en el ejemplo anterior para poder mantenerla en una instrucción aprovechando el hecho de queObject.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:
Como mencionó @TravisClarke en los comentarios, la función de mapa podría acortarse a:
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 está accesible, no se recolectarán basura ni sus entradas.
Ahora, aunque el uso de nuestro método in situ todavía utiliza dos matrices que contienen los pares clave-valor (las matrices de entrada y de 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.
Puede ir un paso más allá y eliminar el crecimiento por completo modificando la matriz de entradas en el lugar en lugar de asignarla a una nueva matriz:
fuente
Object.entries(obj).map(e => [+e[0], e[1]]);
Para recapitular algunas de estas respuestas ahora en 2018, donde ES6 es el estándar.
Comenzando con el objeto:
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.
Finalmente (no es parte de la pregunta original, pero para completar), si necesita buscar fácilmente utilizando 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
fuente
Otra solución más si
Object.entries
no funciona para usted.fuente
En Ecmascript 6,
violín
fuente
.map((value)=>(value))
porción no tiene sentido, solo devuelve una matriz de entrada exactamente equivalente a la obtenida de laObject.entries(obj)
llamada.Uso
Object.keys
yArray#map
métodos.fuente
Use
Object.entries
para obtener cada elemento del Objeto enkey & value
formato, luego amap
través de ellos de esta manera:Pero, si está seguro de que las teclas estarán en orden progresivo , puede usar
Object.values
yArray#map
hacer algo como esto:fuente
Si está usando lodash, podría ser tan simple como esto:
fuente
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:
Si obj es el siguiente:
Entonces la matriz será:
Con las claves de objeto en la matriz de salida
Si escribes en su lugar ('género' es una cadena que eliges):
Conseguirás:
fuente
Sugeriría esta solución más simple de usar
Object.entries()
fuente
Puede usarlo
Object.values([])
, es posible que necesite este polyfill si aún no lo hace:https://stackoverflow.com/a/54822153/846348
Entonces puedes simplemente hacer:
Solo recuerde que las matrices en js solo pueden usar teclas numéricas, por lo que si usó algo más en el objeto, esas se convertirán en `0,1,2 ... x``
Puede ser útil eliminar duplicados, por ejemplo, si tiene una clave única.
fuente
Usar para en
fuente
Objeto de conversión recursivo a matriz
fuente
Podemos cambiar el número a tipo de cadena para clave como a continuación:
fuente
fuente
Esta es mi implementación básica básica:
fuente
Solución simple
``
fuente
puedes usar _.castArray (obj) .
ejemplo:
_.castArray({ 'a': 1 }); // => [{ 'a': 1 }]
fuente