Mi respuesta se basa en gran medida en la respuesta mejor calificada aquí y espero que todos entiendan (también tengo la misma explicación en mi GitHub). Es por eso que su impedancia con el mapa funciona:
Object.keys(images).map((key) => images[key] = 'url(' + '"' + images[key] + '"' +
')');
El propósito de la función es tomar un objeto y modificar el contenido original del objeto utilizando un método disponible para todos los objetos (objetos y matrices por igual) sin devolver una matriz. Casi todo dentro de JS es un objeto, y por esa razón los elementos más abajo en la tubería de herencia pueden usar técnicamente aquellos disponibles para aquellos en la línea (y al revés parece).
La razón por la que esto funciona se debe a que las funciones .map devuelven una matriz que REQUIERE que proporcione un RETORNO explícito o implícito de una matriz en lugar de simplemente modificar un objeto existente. Básicamente, engañas al programa para que piense que el objeto es una matriz usando Object.keys, que te permitirá utilizar la función de mapa con su actuación sobre los valores con los que están asociadas las teclas individuales (en realidad, accidentalmente devolví matrices pero lo arreglé). Mientras no haya un retorno en el sentido normal, no se creará una matriz con el objeto original intacto y modificado según lo programado.
Este programa en particular toma un objeto llamado imágenes y toma los valores de sus claves y agrega etiquetas de URL para usar dentro de otra función. Original es esto:
var images = {
snow: 'https://www.trbimg.com/img-5aa059f5/turbine/bs-md-weather-20180305',
sunny: 'http://www.cubaweather.org/images/weather-photos/large/Sunny-morning-east-
Matanzas-city- Cuba-20170131-1080.jpg',
rain: 'https://i.pinimg.com/originals/23/d8
/ab/23d8ab1eebc72a123cebc80ce32b43d8.jpg' };
... y modificado es esto:
var images = {
snow: url('https://www.trbimg.com/img-5aa059f5/turbine/bs-md-weather-20180305'),
sunny: url('http://www.cubaweather.org/images/weather-photos/large/Sunny-morning-
east-Matanzas-city- Cuba-20170131-1080.jpg'),
rain: url('https://i.pinimg.com/originals/23/d8
/ab/23d8ab1eebc72a123cebc80ce32b43d8.jpg')
};
La estructura original del objeto se deja intacta, lo que permite el acceso normal a la propiedad siempre que no haya un retorno. NO haga que devuelva una matriz como normal y todo estará bien. El objetivo es REASIGNAR los valores originales (imágenes [clave]) a lo que se desea y no a nada más. Por lo que sé, para evitar la salida de la matriz, TIENE que haber REASIGNACIÓN de imágenes [clave] y no hay una solicitud implícita o explícita de devolver una matriz (la asignación de variables hace esto y me fallaba de un lado a otro).
EDITAR:
Para abordar su otro método con respecto a la creación de nuevos objetos para evitar modificar el objeto original (y parece que la reasignación sigue siendo necesaria para evitar crear accidentalmente una matriz como salida). Estas funciones usan sintaxis de flecha y son si simplemente desea crear un nuevo objeto para uso futuro.
const mapper = (obj, mapFn) => Object.keys(obj).reduce((result, key) => {
result[key] = mapFn(obj)[key];
return result;
}, {});
var newImages = mapper(images, (value) => value);
La forma en que funcionan estas funciones es así:
mapFn toma la función que se agregará más tarde (en este caso (valor) => valor) y simplemente devuelve lo que esté almacenado allí como un valor para esa clave (o multiplicado por dos si cambia el valor de retorno como lo hizo) en mapFn ( obj) [clave],
y luego redefine el valor original asociado con la clave en el resultado [clave] = mapFn (obj) [clave]
y devuelve la operación realizada en el resultado (el acumulador ubicado en los corchetes iniciados al final de la función .reduce).
Todo esto se está realizando en el objeto elegido y TODAVÍA NO PUEDE haber una solicitud implícita de una matriz devuelta y solo funciona al reasignar valores, por lo que puedo decir. Esto requiere algo de gimnasia mental pero reduce las líneas de código necesarias como se puede ver arriba. La salida es exactamente la misma que se puede ver a continuación:
{snow: "https://www.trbimg.com/img-5aa059f5/turbine/bs-
md-weather-20180305", sunny: "http://www.cubaweather.org/images/weather-
photos/l…morning-east-Matanzas-city-Cuba-20170131-1080.jpg", rain:
"https://i.pinimg.com/originals/23/d8
/ab/23d8ab1eebc72a123cebc80ce32b43d8.jpg"}
Tenga en cuenta que esto funcionó con NON-NUMBERS. PUEDE duplicar CUALQUIER objeto SIMPLEMENTE DEVOLVIENDO EL VALOR en la función mapFN.
Object.keys
, que no tiene un orden bien definido. Eso puede ser problemático, sugiero usar en suObject.getOwnPropertyNames
lugar.