recorrer propiedades objetos objeto matriz for array agregar javascript underscore.js

javascript - propiedades - recorrer array angular 4



Iterar sobre atributos de objeto y modificarlos (4)

Underscore.js proporciona _.each y _.map en las colecciones, lo que está bien, pero necesito recorrer todos los atributos de mi objeto. Necesito modificar los valores y preservar las claves. Por ejemplo, tengo algo como: {a:1, b:2, c:3} y necesito realizar una operación que cambie el valor pero que mantenga las claves. Digamos, calcularé cuadrados, debería obtener {a:1, b:4, c:9} . La pregunta es: ¿cómo hacer eso usando el guión bajo (no está interesado en javascript de vainilla)? Me encantaría un método como:

var a = {a:1, b:2, c:3} _.magic(a, function(item){ return item*item; });

Además, sería genial si esto fuera posible encadenarlo, ya que estoy haciendo un mapa, volcando el resultado para realizar cada uno y luego usar un mapa nuevamente (porque necesito hacerlo).


Como Justin dijo, _.mapObject podría ser lo que estabas buscando. Pero esto crea un nuevo objeto (extendiendo {} ) que podría no ser lo que quieres (por ejemplo, si no es un objeto simple como el new THREE.Vector3() ), aquí no es bueno reemplazar el objeto original con algo diferente.

Para ese caso (modificando los valores en el lugar en el objeto dado) simplemente use _.each con el tercer parámetro de su función iteratee:

_.each(complexObject, function(value, key, obj) { obj[key] = value * value; });


Miré un poco más en algunos de mis fragmentos para ver si había una opción para mutar el objeto original, pero no encontré nada interesante, así que me quedo con this :

var original = {a:1, b:2, c:3}; var squaredValues = _.object(_.map(original, function (value, key) { return [key, value * value]; }));

Aunque espero que haya una solución más elegante.


Muchas gracias a Javier92, quien me indicó la solución correcta.

De todos modos, no me gusta usar un método de guión bajo que use otros dos métodos de guión bajo (no se puede leer mucho), así que se me ocurrió una función de envoltura simple que se mezcla con el guión bajo:

// mixin to make our new function available via _ _.mixin({ updateAttributes: function(object, iteratee) { return _.object(_.map(object, function (value, key) { return [key, iteratee(value)]; })); } });

Úsalo en algún lugar de tu código:

_.updateAttributes({a:1, b:2, c:3}, function(item){ return item*item; }) // Object {a: 1, b: 4, c: 9}

no podía pensar en una función de una sola palabra (probablemente hay algo mejor que updateAttributes ).


_.mapObject ( agregado en la versión 1.8 ) es exactamente lo que está buscando.

Para versiones anteriores, puede mutar el objeto original usando el tercer argumento de la _.each llamada _.each .

_.each({a:1, b:2, c:3}, function(value, key, obj) { obj[key] = value * value; });

Usar _.reduce con una nota inicial también puede crear un objeto nuevo.

_.reduce({a:1, b:2, c:3}, function(memo, value, key) { memo[key] = value * value; return memo; }, {});

Preferiría el enfoque de _.reduce . Una simple mezcla hará que se comporte exactamente como _.map .

_.mixin({ magic: function(obj, iterator, context) { return _.reduce(obj, function(memo, value, key) { memo[key] = iterator.call(context, value, key, obj); return memo; }, {}); } });