uso que obtener manipular elementos elemento ejemplos con aprender javascript underscore.js lodash

javascript - que - uso del dom



Mapa sobre objetos que conservan claves (10)

¿Qué tal esta versión en JS simple ( ES6 / ES2015 )?

let newObj = Object.assign(...Object.keys(obj).map(k => ({[k]: obj[k] * 3})));

jsbin

Si desea mapear un objeto recursivamente (mapear obj anidado), se puede hacer de esta manera:

const mapObjRecursive = (obj) => { Object.keys(obj).forEach(key => { if (typeof obj[key] === ''object'') obj[key] = mapObjRecursive(obj[key]); else obj[key] = obj[key] * 3; }); return obj; };

jsbin

Desde ES7 / ES2016 puede usar Object.entries lugar de Object.keys como este:

let newObj = Object.assign(...Object.entries(obj).map([k, v] => ({[k]: v * 3})));

La función de map en underscore.js, si se llama con un objeto javascript, devuelve una matriz de valores asignados a partir de los valores del objeto.

_.map({one: 1, two: 2, three: 3}, function(num, key){ return num * 3; }); => [3, 6, 9]

¿Hay alguna manera de hacerlo preservar las llaves? es decir, quiero una función que devuelva

{one: 3, two: 6, three: 9}


Con subrayado

Underscore proporciona una función _.mapObject para asignar los valores y conservar las claves.

_.mapObject({ one: 1, two: 2, three: 3 }, function (v) { return v * 3; }); // => { one: 3, two: 6, three: 9 }

DEMO

Con Lodash

Lodash proporciona una función _.mapValues para asignar los valores y preservar las claves.

_.mapValues({ one: 1, two: 2, three: 3 }, function (v) { return v * 3; }); // => { one: 3, two: 6, three: 9 }

DEMO


Creo que desea una función http://lodash.com/docs#mapValues (para asignar una función a los valores de un objeto), que es lo suficientemente fácil de implementar usted mismo:

mapValues = function(obj, f) { var k, result, v; result = {}; for (k in obj) { v = obj[k]; result[k] = f(v); } return result; };


Logré encontrar la función requerida en lodash, una biblioteca de utilidades similar al guión bajo.

http://lodash.com/docs#mapValues

_.mapValues(object, [callback=identity], [thisArg])

Crea un objeto con las mismas claves que el objeto y los valores generados al ejecutar cada propiedad enumerable de un objeto a través de la devolución de llamada. La devolución de llamada está vinculada a thisArg y se invoca con tres argumentos; (valor, clave, objeto).



Sé que esto es viejo, pero ahora Underscore tiene un nuevo mapa para objetos:

_.mapObject(object, iteratee, [context])

Por supuesto, puede crear un mapa flexible para matrices y objetos

_.fmap = function(arrayOrObject, fn, context){ if(this.isArray(arrayOrObject)) return _.map(arrayOrObject, fn, context); else return _.mapObject(arrayOrObject, fn, context); }


Sé que ha pasado mucho tiempo, pero aún falta la solución más obvia por fold (también conocida como reduce in js), para completar, la dejo aquí:

function mapO(f, o) { return Object.keys(o).reduce((acc, key) => { acc[key] = f(o[key]) return acc }, {}) }


_.map devuelve una matriz, no un objeto.

Si quieres un objeto, es mejor utilizar una función diferente, como each ; si realmente quieres usar el mapa, puedes hacer algo como esto:

Object.keys(object).map(function(value, index) { object[value] *= 3; })

pero eso es confuso, al ver el map uno esperaría tener un arreglo como resultado y luego hacer algo con él.


Una solución de mezcla para el error del mapa de subrayado: P

_.mixin({ mapobj : function( obj, iteratee, context ) { if (obj == null) return []; iteratee = _.iteratee(iteratee, context); var keys = obj.length !== +obj.length && _.keys(obj), length = (keys || obj).length, results = {}, currentKey; for (var index = 0; index < length; index++) { currentKey = keys ? keys[index] : index; results[currentKey] = iteratee(obj[currentKey], currentKey, obj); } if ( _.isObject( obj ) ) { return _.object( results ) ; } return results; } });

Una solución simple que conserva la clave correcta y regresa como objeto. Todavía se usa de la misma manera que como invitado. Se puede usar esta función para anular la función _.map.

o simplemente como yo lo usé como mixin

_.mapobj ( options , function( val, key, list )


var mapped = _.reduce({ one: 1, two: 2, three: 3 }, function(obj, val, key) { obj[key] = val*3; return obj; }, {}); console.log(mapped);

<script src="http://underscorejs.org/underscore-min.js"></script> <script src="https://getfirebug.com/firebug-lite-debug.js"></script>