¿Cómo puedo transformar un big object
to array
con lodash?
var obj = {
22: {name:"John", id:22, friends:[5,31,55], works:{books:[], films:[],}
12: {name:"Ivan", id:12, friends:[2,44,12], works:{books:[], films:[],}
}
// transform to
var arr = [{name:"John", id:22...},{name:"Ivan", id:12...}]
javascript
arrays
object
lodash
siavolt
fuente
fuente
Respuestas:
Tu puedes hacer
Para documentación ver aquí.
fuente
id
propiedad no existiera y quisiera crearla en función de la clave de cada objeto.var arr = _.values(_.mapKeys(obj, function(value, key) { value.id = key; return value; }));
return
valor a una matriz como esta:const divisionsList = []; _.mapKeys(divisions, (value, key) => { divisionsList[key] = value; });
agradecería cualquier comentario o sugerencia para mejorar este enfoque.const toArrayWithKey = (obj, keyAs) => _.values(_.mapValues(obj, (value, key) => { value[keyAs] = key; return value; }));
Salidas como:
fuente
toArray
no hay forma de preservar las claves si es necesario.Una solución nativa moderna si alguien está interesado:
o (no IE):
fuente
Object.keys(obj).map(key=>({key,value: obj[key]}))
const arr = Object.keys(obj).map(id => ({ id, ...obj[id] }));
esto traería todo el objeto a los datos devueltos no? (usando 'id' ya que el autor de la pregunta original quería almacenar su clave como id prop)Para mí, esto funcionó:
Da vueltas
dentro
fuente
_.map(data, (v,k)=>({[k]: v}))
Consulte mi respuesta para obtener más detalles._.toPairs
y_fromPairs
es adicional e innecesario aquí.[{key: 'someKey', val: 'The value'}, {....},...]
Hay bastantes maneras de obtener el resultado que busca. Vamos a dividirlos en categorías:
Solo valores ES6 :
El método principal para esto es Object.values . Pero usando Object.keys y Array.map también podrías llegar al resultado esperado:
Mostrar fragmento de código
Clave y valor de ES6 :
Usando el mapa y las propiedades dinámicas / calculadas de ES6 y la desestructuración puede retener la clave y devolver un objeto del mapa.
Mostrar fragmento de código
Solo valores Lodash :
_.values
Sin embargo, el método diseñado para esto es que hay "accesos directos"_.map
y el método de utilidad_.toArray
que también devolvería una matriz que contiene solo los valores del objeto. También podría_.map
pensar en_.keys
y obtener los valores del objeto utilizando laobj[key]
notación.Nota:
_.map
cuando se pasa, un objeto usaría subaseMap
controlador que está básicamenteforEach
en las propiedades del objeto.Mostrar fragmento de código
Clave y valor de Lodash :
Mostrar fragmento de código
Tenga en cuenta que en los ejemplos anteriores se utiliza ES6 (funciones de flecha y propiedades dinámicas). Puede usar lodash
_.fromPairs
y otros métodos para componer un objeto si ES6 es un problema.fuente
Si desea que la clave (id en este caso) se conserve como una propiedad de cada elemento de la matriz, puede hacerlo
fuente
Actualización 2017: Object.values , lodash values y toArray lo hacen. Y para preservar el mapa de teclas y el operador de propagación, juegue bien:
fuente
Transformar objeto en matriz con JavaScript simple (
ECMAScript-2016
)Object.values
:Si también desea mantener las teclas use
Object.entries
yArray#map
así:fuente
var arr = _.map(obj)
También puede usar la
_.map
función (de amboslodash
yunderscore
)object
, manejará internamente ese caso, iterará sobre cada valor y clave con su iterado, y finalmente devolverá una matriz. De hecho, puede usarlo sin iteración (solo_.map(obj)
) si solo desea una matriz de valores. Lo bueno es que, si necesita alguna transformación intermedia, puede hacerlo de una vez.Ejemplo:
Mostrar fragmento de código
Sin embargo, si desea transformar su objeto, puede hacerlo, incluso si necesita preservar la clave, puede hacerlo (
_.map(obj, (v, k) => {...}
) con un argumento adicionalmap
y luego usarlo como desee.Sin embargo, hay otra solución Vanilla JS para esto (ya que cada
lodash
solución debería tener una versión JS pura) como:Object.keys
y luegomap
a los valoresObject.values
(en ES-2017)Object.entries
y luegomap
cada par clave / valor (en ES-2017)for...in
bucle y use cada tecla para fetear valoresY mucho más. Pero dado que esta pregunta es para
lodash
(y suponiendo que alguien ya la esté usando), entonces no necesita pensar mucho sobre la versión, el soporte de métodos y el manejo de errores si no se encuentran.Hay otras soluciones lodash como
_.values
(más legible para un propósito específico), o obtener pares y luego mapear y así sucesivamente. pero en el caso de que su código necesite flexibilidad para poder actualizarlo en el futuro, ya que necesita preservarkeys
o transformar un poco los valores, entonces la mejor solución es usar un solo_.map
como se indica en esta respuesta. Eso no será tan difícil según la legibilidad también.fuente
Objeto a matriz
De todas las respuestas, creo que esta es la mejor:
que transforma:
a:
Matriz a objeto
Para transformar de nuevo:
Para transformar de nuevo manteniendo la clave en el valor:
Daré:
Para el último ejemplo, también puede usar lodash
_.keyBy(arr, 'key')
o_.keyBy(arr, i => i.key)
.fuente
Si desea una asignación personalizada (como Array.prototype.map original) de Object en una matriz, puede usar
_.forEach
:Ver
lodash
documento de _.forEach https://lodash.com/docs/#forEachfuente