La mia risposta è in gran parte basata sulla risposta più votata qui e spero che tutti capiscano (hanno la stessa spiegazione anche sul mio GitHub). Ecco perché la sua impementazione con la mappa funziona:
Object.keys(images).map((key) => images[key] = 'url(' + '"' + images[key] + '"' +
')');
Lo scopo della funzione è di prendere un oggetto e modificare il contenuto originale dell'oggetto usando un metodo disponibile per tutti gli oggetti (oggetti e matrici allo stesso modo) senza restituire un array. Quasi tutto in JS è un oggetto, e per questo motivo elementi più in basso nella pipeline dell'eredità possono potenzialmente tecnicamente utilizzare quelli disponibili per quelli in cima alla linea (e al contrario appare).
Il motivo per cui funziona è dovuto alle funzioni .map che restituiscono un array RICHIESTO di fornire un RITORNO esplicito o implicito di un array anziché semplicemente modificare un oggetto esistente. In sostanza, induci il programma a pensare che l'oggetto sia un array usando Object.keys che ti permetterà di usare la funzione map con la sua azione sui valori a cui sono associate le singole chiavi (in realtà ho restituito accidentalmente array ma lo ho riparato). Finché non c'è un ritorno in senso normale, non ci sarà alcun array creato con l'oggetto originale intatto e modificato come programmato.
Questo particolare programma prende un oggetto chiamato images e prende i valori delle sue chiavi e aggiunge i tag url per l'uso all'interno di un'altra funzione. L'originale è questo:
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 modificato è questo:
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 struttura originale dell'oggetto viene lasciata intatta, consentendo il normale accesso alle proprietà purché non vi sia un ritorno. NON farlo restituire un array come normale e tutto andrà bene. L'obiettivo è Riassegnare i valori originali (immagini [chiave]) a ciò che si desidera e non a nient'altro. Per quanto ne so, al fine di prevenire l'output dell'array, DEVE essere RIABILITAZIONE delle immagini [chiave] e nessuna richiesta implicita o esplicita di restituire un array (l'assegnazione variabile fa questo e stava andando avanti e indietro per me).
MODIFICARE:
Andando ad affrontare il suo altro metodo per quanto riguarda la creazione di nuovi oggetti per evitare di modificare l'oggetto originale (e la riassegnazione sembra essere ancora necessaria per evitare di creare accidentalmente un array come output). Queste funzioni utilizzano la sintassi della freccia e sono se si desidera semplicemente creare un nuovo oggetto per 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);
Il modo in cui funzionano queste funzioni è così:
mapFn accetta la funzione da aggiungere in seguito (in questo caso (valore) => valore) e restituisce semplicemente tutto ciò che è memorizzato lì come valore per quella chiave (o moltiplicato per due se si modifica il valore restituito come ha fatto lui) in mapFn ( obj) [key],
e quindi ridefinisce il valore originale associato alla chiave nel risultato [chiave] = mapFn (obj) [chiave]
e restituisce l'operazione eseguita sul risultato (l'accumulatore situato tra parentesi iniziate al termine della funzione .riduce).
Tutto questo viene eseguito sull'oggetto scelto e ANCORA NON PUO 'ESSERE una richiesta implicita per un array restituito e funziona solo quando si riassegnano valori per quanto posso dire. Ciò richiede una certa ginnastica mentale, ma riduce le linee di codice necessarie come si può vedere sopra. L'output è esattamente lo stesso che si può vedere di seguito:
{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"}
Tieni presente che ha funzionato con i NON NUMERI. È possibile duplicare QUALUNQUE oggetto SEMPLICEMENTE RITORNANDO IL VALORE nella funzione mapFN.
Object.keys
, che non ha alcun ordine ben definito. Questo può essere problematico, suggerisco di usareObject.getOwnPropertyNames
invece.