objetos - metodos en javascript
transformar objeto a matriz con lodash (8)
¿Cómo puedo transformar un object
grande en una array
con lodash?
Ejemplo:
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...}]
¡Gracias!
Actualización de 2017: Object.values , lodash values y lodash.com/docs#toArray do it. Y para preservar el map teclas y extender el juego , juega agradable:
// import { toArray, map } from ''lodash''
const map = _.map
const input = {
key: {
value: ''value''
}
}
const output = map(input, (value, key) => ({
key,
...value
}))
console.log(output)
// >> [{key: ''key'', value: ''value''}])
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>
Además de todas las respuestas existentes (que son realmente buenas y perfectas), simplemente agregue otro enfoque aquí:
También puede usar la función _.map
(tanto de lodash
como de underscore
) con un object
, manejará internamente ese caso, iterará sobre cada valor y clave con su iteratee, y finalmente devolverá una matriz. De hecho, puede usarlo sin ninguna iteración (solo _.map(obj)
) si solo quiere una matriz de valores. Lo bueno es que, si necesita una transformación intermedia, puede hacerlo de una vez.
Ejemplo:
var obj = {
key1: {id: 1, name: ''A''},
key2: {id: 2, name: ''B''},
key3: {id: 3, name: ''C''}
};
var array1 = _.map(obj, v=>v);
console.log(''Array 1: '', array1);
/*Actually you don''t need the callback v=>v if you
are not transforming anything in between, v=>v is default*/
//SO simply you can use
var array2 = _.map(obj);
console.log(''Array 2: '', array2);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>
Sin embargo, si desea transformar su objeto puede hacerlo, incluso si necesita conservar la clave, puede hacerlo ( _.map(obj, (v, k) => {...}
) con un argumento adicional en el map
y luego usarlo como quieras.
Para mí, esto funcionó:
_.map(_.toPairs(data), d => _.fromPairs([d]));
Da vueltas
{"a":"b", "c":"d", "e":"f"}
dentro
[{"a":"b"}, {"c":"d"}, {"e":"f"}]
Si desea que la clave (id en este caso) se conserve como propiedad de cada elemento de matriz, puede hacerlo
const arr = _(obj) //wrap object so that you can chain lodash methods
.mapValues((value, id)=>_.merge({}, value, {id})) //attach id to object
.values() //get the values of the result
.value() //unwrap array of objects
Si desea una asignación personalizada (como Array.prototype.map) original de Object en una matriz, puede simplemente usar _.forEach
:
let myObject = {
key1: "value1",
key2: "value2",
// ...
};
let myNewArray = [];
_.forEach(myObject, (value, key) => {
myNewArray.push({
someNewKey: key,
someNewValue: value.toUpperCase() // just an example of new value based on original value
});
});
// myNewArray => [{ someNewKey: key1, someNewValue: ''VALUE1'' }, ... ];
Ver lodash
doc of _.forEach https://lodash.com/docs/#forEach
Una solución nativa moderna si alguien está interesado (gracias por la mejora de Koushik):
const arr = Object.keys(obj).map(key => ({ key, value: obj[key] }));
_.toArray(obj);
Salidas como:
[
{
"name": "Ivan",
"id": 12,
"friends": [
2,
44,
12
],
"works": {
"books": [],
"films": []
}
},
{
"name": "John",
"id": 22,
"friends": [
5,
31,
55
],
"works": {
"books": [],
"films": []
}
}
]"