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})));
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;
};
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 }
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 }
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).
Puede usar _.mapValues(users, function(o) { return o.age; });
en Lodash y _.mapObject({ one: 1, two: 2, three: 3 }, function (v) { return v * 3; });
en Underscore.
Consulte la documentación cruzada aquí: http://jonathanpchen.com/underdash-api/#mapvalues-object-iteratee-identity
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>