Moja odpowiedź jest w dużej mierze oparta na najwyżej ocenianej odpowiedzi tutaj i mam nadzieję, że wszyscy rozumieją (mają to samo wytłumaczenie na moim GitHubie). Oto dlaczego jego impementacja mapą działa:
Object.keys(images).map((key) => images[key] = 'url(' + '"' + images[key] + '"' +
')');
Celem tej funkcji jest pobranie obiektu i zmodyfikowanie oryginalnej zawartości obiektu za pomocą metody dostępnej dla wszystkich obiektów (zarówno obiektów, jak i tablic) bez zwracania tablicy. Prawie wszystko w JS jest przedmiotem i dlatego elementy znajdujące się w dalszej części procesu dziedziczenia mogą potencjalnie technicznie wykorzystać te dostępne dla osób znajdujących się powyżej linii (i na odwrót).
Powodem tego jest to, że funkcje .map zwracają tablicę WYMAGAJĄCĄ podania jawnego lub niejawnego RETURN tablicy zamiast po prostu modyfikowania istniejącego obiektu. Zasadniczo oszukasz program, aby pomyślał, że obiekt jest tablicą, używając Object.keys, który pozwoli ci korzystać z funkcji mapowania z działaniem na wartości, z którymi powiązane są poszczególne klucze (faktycznie przypadkowo zwróciłem tablice, ale je naprawiłem). Dopóki nie nastąpi zwrot w normalnym sensie, nie powstanie tablica z oryginalnym obiektem w stanie nienaruszonym i zmodyfikowanym zgodnie z zaprogramowaniem.
Ten konkretny program pobiera obiekt o nazwie obrazy i pobiera wartości jego kluczy oraz dołącza znaczniki URL do użycia w innej funkcji. Oryginał to:
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' };
... i zmodyfikowano to:
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')
};
Oryginalna struktura obiektu pozostaje nienaruszona, umożliwiając normalny dostęp do właściwości, o ile nie ma zwrotu. NIE każ mu zwracać tablicy jak zwykle i wszystko będzie dobrze. Celem jest PONOWNE PRZYPISANIE oryginalnych wartości (obrazów [klucz]) do tego, co jest potrzebne, a nie do niczego innego. O ile mi wiadomo, aby zapobiec wyjściu z tablicy, MUSI BYĆ PRZEKAZANIE obrazów [klucz] i nie może być domniemana ani wyraźna prośba o zwrócenie tablicy (przypisanie zmiennej robi to i było dla mnie błędne).
EDYTOWAĆ:
Zajmę się jego drugą metodą dotyczącą tworzenia nowego obiektu, aby uniknąć modyfikacji oryginalnego obiektu (a ponowne przypisanie wydaje się być nadal konieczne, aby uniknąć przypadkowego utworzenia tablicy jako wyniku). Funkcje te używają składni strzałek i są przeznaczone, jeśli chcesz po prostu utworzyć nowy obiekt do wykorzystania w przyszłości.
const mapper = (obj, mapFn) => Object.keys(obj).reduce((result, key) => {
result[key] = mapFn(obj)[key];
return result;
}, {});
var newImages = mapper(images, (value) => value);
Sposób działania tych funkcji jest następujący:
mapFn pobiera funkcję, która zostanie dodana później (w tym przypadku (wartość) => wartość) i po prostu zwraca wszystko, co jest tam zapisane, jako wartość dla tego klucza (lub pomnożona przez dwa, jeśli zmienisz wartość zwracaną tak jak on) w mapFn ( obj) [klucz],
a następnie redefiniuje pierwotną wartość powiązaną z kluczem w wyniku [klucz] = mapFn (obj) [klucz]
i zwraca operację wykonaną na wyniku (akumulator umieszczony w nawiasach zainicjowany na końcu funkcji redukcji).
Wszystko to jest wykonywane na wybranym obiekcie i JESZCZE NIE MOŻE być niejawnym żądaniem zwróconej tablicy i działa tylko przy ponownym przypisywaniu wartości, o ile wiem. Wymaga to gimnastyki umysłowej, ale zmniejsza liczbę wymaganych linii kodu, jak widać powyżej. Dane wyjściowe są dokładnie takie same, jak widać poniżej:
{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"}
Pamiętaj, że działało to z NIE-LICZBAMI. MOŻESZ zduplikować KAŻDY obiekt, PO PROSTU POWRACAJĄCĄ WARTOŚĆ w funkcji mapFN.
Object.keys
, które nie mają dobrze określonej kolejności. Może to być problematyczne, sugeruję użycieObject.getOwnPropertyNames
zamiast tego.