Minha resposta é amplamente baseada na resposta mais alta classificada aqui e espero que todos entendam (tenha a mesma explicação no meu GitHub também). É por isso que sua impementação com o mapa funciona:
Object.keys(images).map((key) => images[key] = 'url(' + '"' + images[key] + '"' +
')');
O objetivo da função é pegar um objeto e modificar o conteúdo original do objeto usando um método disponível para todos os objetos (objetos e matrizes) sem retornar uma matriz. Quase tudo no JS é um objeto e, por esse motivo, os elementos mais abaixo no pipeline de herança podem potencialmente usar tecnicamente aqueles disponíveis para os que estão na linha de frente (e o inverso aparece).
O motivo disso funcionar é que as funções .map retornam uma matriz, EXIGINDO que você forneça um RETURN explícito ou implícito de uma matriz, em vez de simplesmente modificar um objeto existente. Você basicamente engana o programa para pensar que o objeto é uma matriz usando Object.keys, que permitirá que você use a função map com sua atuação nos valores aos quais as chaves individuais estão associadas (na verdade, retornei acidentalmente matrizes, mas a corrigi). Enquanto não houver retorno no sentido normal, não haverá matriz criada com o objeto original ainda intacto e modificado conforme programado.
Esse programa específico pega um objeto chamado images e pega os valores de suas chaves e anexa tags de URL para uso em outra função. Original é este:
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' };
... e modificado é este:
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')
};
A estrutura original do objeto é deixada intacta, permitindo o acesso normal à propriedade, desde que não haja retorno. NÃO faça com que ele retorne uma matriz como normal e tudo ficará bem. O objetivo é reatribuir os valores originais (imagens [chave]) ao que se deseja e não a mais nada. Até onde eu sei, para impedir a saída da matriz, TEM DE SER REASSIGNAMENTO de imagens [chave] e nenhuma solicitação implícita ou explícita para retornar uma matriz (a atribuição de variáveis faz isso e estava sendo repetida para mim).
EDITAR:
Indo abordar seu outro método em relação à criação de novos objetos para evitar modificar o objeto original (e a reatribuição parece ainda ser necessária para evitar a criação acidental de uma matriz como saída). Essas funções usam sintaxe de seta e existem se você simplesmente deseja criar um novo 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);
A maneira como essas funções funcionam é assim:
mapFn pega a função a ser adicionada mais tarde (neste caso (valor) => valor) e simplesmente retorna o que estiver armazenado como um valor para essa chave (ou multiplicado por dois se você alterar o valor de retorno como ele fez) em mapFn ( obj) [chave],
e redefine o valor original associado à chave no resultado [chave] = mapFn (obj) [chave]
e retorna a operação executada no resultado (o acumulador localizado nos colchetes iniciado no final da função .reduce).
Tudo isso está sendo realizado no objeto escolhido e AINDA NÃO PODE haver uma solicitação implícita para uma matriz retornada e só funciona ao reatribuir valores, tanto quanto eu sei. Isso requer alguma ginástica mental, mas reduz as linhas de código necessárias, como pode ser visto acima. A saída é exatamente a mesma que pode ser vista abaixo:
{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"}
Lembre-se de que isso funcionou com NÃO-NÚMEROS. Você pode duplicar QUALQUER objeto simplesmente retornando o valor na função mapFN.
Object.keys
, que não tem nenhuma ordem bem definida. Isso pode ser problemático, sugiro usarObject.getOwnPropertyNames
.