Meine Antwort basiert größtenteils auf der am höchsten bewerteten Antwort hier und hoffentlich versteht jeder (habe die gleiche Erklärung auch auf meinem GitHub). Deshalb funktioniert seine Implementierung mit der Karte:
Object.keys(images).map((key) => images[key] = 'url(' + '"' + images[key] + '"' +
')');
Der Zweck der Funktion besteht darin, ein Objekt zu nehmen und den ursprünglichen Inhalt des Objekts mithilfe einer Methode zu ändern, die allen Objekten (Objekten und Arrays gleichermaßen) zur Verfügung steht, ohne ein Array zurückzugeben. Fast alles in JS ist ein Objekt, und aus diesem Grund können Elemente weiter unten in der Vererbungspipeline möglicherweise technisch diejenigen verwenden, die für diejenigen auf der ganzen Linie verfügbar sind (und umgekehrt, wie es scheint).
Der Grund dafür ist, dass die .map-Funktionen ein Array zurückgeben, das erfordert, dass Sie eine explizite oder implizite RETURN eines Arrays angeben, anstatt einfach ein vorhandenes Objekt zu ändern. Sie täuschen das Programm im Wesentlichen vor, das Objekt sei ein Array, indem Sie Object.keys verwenden, mit dem Sie die Map-Funktion verwenden können, die auf die Werte einwirkt, denen die einzelnen Schlüssel zugeordnet sind (ich habe Arrays tatsächlich versehentlich zurückgegeben, aber behoben). Solange es keine Rückkehr im normalen Sinne gibt, wird kein Array erstellt, bei dem das ursprüngliche Objekt noch intakt ist und wie programmiert geändert wird.
Dieses spezielle Programm nimmt ein Objekt namens images und nimmt die Werte seiner Schlüssel und hängt URL-Tags zur Verwendung in einer anderen Funktion an. Original ist das:
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' };
... und modifiziert ist dies:
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')
};
Die ursprüngliche Struktur des Objekts bleibt erhalten, sodass ein normaler Zugriff auf die Eigenschaft möglich ist, solange keine Rückgabe erfolgt. Lassen Sie es NICHT wie gewohnt ein Array zurückgeben, und alles wird gut. Das Ziel ist es, die ursprünglichen Werte (Bilder [Schlüssel]) dem zuzuordnen, was gewünscht wird, und nicht irgendetwas anderem. Soweit ich weiß, MUSS eine Neuzuordnung von Bildern [Schlüssel] und keine implizite oder explizite Aufforderung zur Rückgabe eines Arrays erfolgen, um eine Array-Ausgabe zu verhindern (die Variablenzuweisung tut dies und war für mich ein Fehler).
BEARBEITEN:
Gehen Sie auf seine andere Methode zur Erstellung neuer Objekte ein, um zu vermeiden, dass das ursprüngliche Objekt geändert wird (und eine Neuzuweisung scheint weiterhin erforderlich zu sein, um zu vermeiden, dass versehentlich ein Array als Ausgabe erstellt wird). Diese Funktionen verwenden die Pfeilsyntax und sind, wenn Sie einfach ein neues Objekt für die zukünftige Verwendung erstellen möchten.
const mapper = (obj, mapFn) => Object.keys(obj).reduce((result, key) => {
result[key] = mapFn(obj)[key];
return result;
}, {});
var newImages = mapper(images, (value) => value);
Die Funktionsweise dieser Funktionen ist wie folgt:
mapFn übernimmt die Funktion, die später hinzugefügt wird (in diesem Fall (Wert) => Wert) und gibt einfach alles, was dort gespeichert ist, als Wert für diesen Schlüssel zurück (oder multipliziert mit zwei, wenn Sie den Rückgabewert wie er ändern) in mapFn ( obj) [Schlüssel],
und definiert dann den ursprünglichen Wert neu, der dem Schlüssel in result [key] = mapFn (obj) [key] zugeordnet ist.
und gibt die Operation zurück, die für das Ergebnis ausgeführt wurde (der Akkumulator in den Klammern, die am Ende der .reduce-Funktion ausgelöst wurden).
All dies wird für das ausgewählte Objekt ausgeführt und es kann NOCH KEINE implizite Anforderung für ein zurückgegebenes Array geben und funktioniert nur, wenn Werte neu zugewiesen werden, soweit ich das beurteilen kann. Dies erfordert etwas mentale Gymnastik, reduziert jedoch die benötigten Codezeilen, wie oben zu sehen ist. Die Ausgabe ist genau die gleiche wie unten gezeigt:
{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"}
Denken Sie daran, dass dies mit NON-NUMBERS funktioniert hat. Sie können jedes Objekt duplizieren, indem Sie einfach den Wert in der Funktion mapFN zurückgeben.
Object.keys
, die keine genau definierte Reihenfolge haben. Das kann problematisch sein, ich schlageObject.getOwnPropertyNames
stattdessen vor.