¿Cómo puedo transformar un big objectto arraycon 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
idpropiedad 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; }));returnvalor 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
toArrayno 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._.toPairsy_fromPairses 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 :
_.valuesSin embargo, el método diseñado para esto es que hay "accesos directos"_.mapy el método de utilidad_.toArrayque también devolvería una matriz que contiene solo los valores del objeto. También podría_.mappensar en_.keysy obtener los valores del objeto utilizando laobj[key]notación.Nota:
_.mapcuando se pasa, un objeto usaría subaseMapcontrolador que está básicamenteforEachen 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
_.fromPairsy 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.entriesyArray#mapasí:fuente
var arr = _.map(obj)También puede usar la
_.mapfunción (de amboslodashyunderscore)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 adicionalmapy luego usarlo como desee.Sin embargo, hay otra solución Vanilla JS para esto (ya que cada
lodashsolución debería tener una versión JS pura) como:Object.keysy luegomapa los valoresObject.values(en ES-2017)Object.entriesy luegomapcada par clave / valor (en ES-2017)for...inbucle 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 preservarkeyso transformar un poco los valores, entonces la mejor solución es usar un solo_.mapcomo 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
lodashdocumento de _.forEach https://lodash.com/docs/#forEachfuente