¿Hay una función lodash incorporada para tomar esto?
var params = [
{ name: 'foo', input: 'bar' },
{ name: 'baz', input: 'zle' }
];
Y da salida a esto:
var output = {
foo: 'bar',
baz: 'zle'
};
En este momento solo estoy usando Array.prototype.reduce()
:
function toHash(array, keyName, valueName) {
return array.reduce(function(dictionary, next) {
dictionary[next[keyName]] = next[valueName];
return dictionary;
}, {});
}
toHash(params, 'name', 'input');
Me pregunto si hay un atajo pesado.
javascript
lodash
núcleo
fuente
fuente
_.keyBy
transformará toda la matriz en un objeto, mientras que la pregunta se trata principalmente de tener un elemento de cada objeto en la matriz como clave y otro elemento como valor. Si_.keyBy
se usa, todos los valores serán objetos.Debería utilizar _.keyBy para convertir fácilmente una matriz en un objeto.
Documentos aquí
Ejemplo de uso a continuación:
var params = [ { name: 'foo', input: 'bar' }, { name: 'baz', input: 'zle' } ]; console.log(_.keyBy(params, 'name'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
Si es necesario, puede manipular la matriz antes de usar _.keyBy o el objeto después de usar _.keyBy para obtener el resultado exacto deseado.
fuente
Sí, está aquí , usando
_.reduce
var params = [ { name: 'foo', input: 'bar' }, { name: 'baz', input: 'zle' } ]; _.reduce(params , function(obj,param) { obj[param.name] = param.input return obj; }, {});
fuente
reduce()
aparece otro caso de uso. ¡Manera inteligente de hacerlo!_.reduce
menos que exprese con precisión lo que está tratando de hacer: oscurece significativamente el punto del código en cualquier otro caso. Personalmente prefiero la_.zipObject
solución de @djechlin; de lo contrario, el enfoque_.keyBy
/_.mapValues
.Esto parece un trabajo para Object.assign:
const output = Object.assign({}, ...params.map(p => ({[p.name]: p.input})));
Editado para envolver como una función similar a los OP, esto sería:
const toHash = (array, keyName, valueName) => Object.assign({}, ...array.map(o => ({[o[keyName]]: o[valueName]})));
(Gracias a Ben Steward, buen pensamiento ...)
fuente
Puede usar un javascript de línea con el método de reducción de matriz y la desestructuración de ES6 para convertir una matriz de pares de valores clave en un objeto.
arr.reduce((map, { name, input }) => ({ ...map, [name]: input }), {});
fuente
Esto probablemente sea más detallado de lo que desea, pero está solicitando una operación un poco compleja, por lo que el código real podría estar involucrado (el horror).
Mi recomendación, con
zipObject
eso es bastante lógico:_.zipObject(_.map(params, 'name'), _.map(params, 'input'));
Otra opción, más hacky, usando
fromPairs
:_.fromPairs(_.map(params, function(val) { return [val['name'], val['input']));
La función anónima muestra la piratería: no creo que JS garantice el orden de los elementos en la iteración del objeto, por lo que la llamada
.values()
no funcionará.fuente
fromPairs
y, devalues()
hecho , llamar no sirve. Al menos desde el punto de vista de la legibilidad.Otra forma con lodash
crear pares, y luego construir un objeto o
ES6 Map
fácilmente_(params).map(v=>[v.name, v.input]).fromPairs().value()
o
_.fromPairs(params.map(v=>[v.name, v.input]))
Aquí hay un ejemplo de trabajo
Mostrar fragmento de código
var params = [ { name: 'foo', input: 'bar' }, { name: 'baz', input: 'zle' } ]; var obj = _(params).map(v=>[v.name, v.input]).fromPairs().value(); console.log(obj);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>
fuente
Object.fromEntries(params.map(v => [v.name, v.input]))
También puede resolver sin usar ninguna función lodash como esta:
let paramsVal = [ { name: 'foo', input: 'bar' }, { name: 'baz', input: 'zle' } ]; let output = {}; paramsVal.forEach(({name, input})=>{ output[name] = input; }) console.log(output);
fuente