Pregunta lodash - proyecto / transforma el objeto en una matriz de valor clave


Estoy a punto de usar forOwn iterar a través de las propiedades de un objeto y crear una matriz de forma manual y no puede ayudar a pensar que ya hay un oneliner disponible para hacerlo.

{ 
  prop1 : "value",
  prop2: { sub:1}
}

a:

[ 
   {key: "prop1", value: "value"},
   {key: "prop2", value: {sub:1}}
]

Gracias


18
2017-08-19 16:09


origen


Respuestas:


Puedes usar lodash's _.mapa():

var obj = { 
  prop1 : "value",
  prop2: { sub:1}
};

var result = _.map(obj, function(value, prop) {
  return { prop: prop, value: value };
});

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.2/lodash.min.js"></script>

O puede hacerlo usando ES6 desestructuración de matriz, con Nombres abreviados de propiedady Object#entries (ECMAScript 2017 Draft) o lodash's _.entries:

const obj = { 
  prop1 : "value",
  prop2: { sub:1}
};

const result = Object.entries(obj).map(([prop, value]) => ({ prop, value }));

console.log(result);


26
2017-08-19 20:21



Ni siquiera necesitas lodash para eso:

var arr = Object.keys(obj).map(function(key){
  return { key: key, value: obj[key] };
});

10
2017-08-19 16:14



Un poco de ES6:

_.map( obj, (value, key) => ({key,value}) )


9
2018-06-02 15:04



Si estás usando lodash / fp puedes usar _.entries

const a = { one: 123, two: { value: 'b' }};

const pairs = _.entries(a).map(p => ({ key:p[0], value: p[1] }))

console.log(pairs)
// [
//   {
//     "key": "one",
//     "value": 123
//   },
//   {
//     "key": "two",
//     "value": {
//       "value": "b"
//     }
//   }
// ]
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash-fp/4.15.0/lodash-fp.js"></script>


2
2017-09-08 14:09



Puedes usar pairs si se ajusta a su caso:

_.pairs({ 'barney': 36, 'fred': 40 });
// → [['barney', 36], ['fred', 40]]

Árbitro: https://lodash.com/docs#pairs


1
2017-08-19 16:20



En respuesta al comentario de Ori y para completar, publiqué la versión _.forOwn. Es marginalmente más rápido pero necesita declarar el conjunto primero (no es un trazador de líneas).

var arr = [];
_.forOwn(obj,function(item, key) {
    arr.push({ property : key, value : item});
});

1
2017-08-20 09:19