私の回答は主に、ここで最も評価の高い回答に基づいています。うまくいけば、誰もが理解してくれます (私の GitHub にも同じ説明があります)。これが、マップを使用した彼の実装が機能する理由です。
Object.keys(images).map((key) => images[key] = 'url(' + '"' + images[key] + '"' +
')');
この関数の目的は、オブジェクトを取得し、配列を返さずにすべてのオブジェクト (オブジェクトと配列の両方) で使用できるメソッドを使用して、オブジェクトの元の内容を変更することです。JS 内のほとんどすべてがオブジェクトです。そのため、継承のパイプラインのさらに下にある要素は、技術的には、上にある要素が利用できる要素を使用する可能性があります (逆の場合も同様です)。
これが機能する理由は、既存のオブジェクトを単に変更するのではなく、配列の明示的または暗黙的な RETURN を提供する必要がある配列を返す .map 関数によるものです。基本的に、Object.keys を使用してオブジェクトが配列であるとプログラムをだまして、個々のキーが関連付けられている値に作用する map 関数を使用できるようにします (実際には誤って配列を返しましたが、修正しました)。通常の意味での戻りがない限り、元のオブジェクトをそのまま使用して作成され、プログラムどおりに変更された配列はありません。
この特定のプログラムは、images というオブジェクトを取り、そのキーの値を取り、別の関数内で使用するために url タグを追加します。元はこれです:
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' };
...そして変更されたのはこれです:
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')
};
オブジェクトの元の構造はそのまま残され、戻り値がない限り、通常のプロパティ アクセスが可能になります。通常のように配列を返さないでください。すべて問題ありません。目標は、元の値 (images[key]) を必要なものに再割り当てすることです。私の知る限り、配列出力を防ぐには、images[key] の REASSIGNMENT が必要であり、配列を返すための暗黙的または明示的な要求は必要ありません (変数の割り当てはこれを行い、私にとっては前後にグリッチしていました)。
編集:
元のオブジェクトの変更を避けるために、新しいオブジェクトの作成に関する彼の他の方法に対処する予定です(出力として誤って配列を作成することを避けるために、再割り当てが必要なようです)。これらの関数は矢印構文を使用し、将来使用するために単に新しいオブジェクトを作成したい場合に使用します。
const mapper = (obj, mapFn) => Object.keys(obj).reduce((result, key) => {
result[key] = mapFn(obj)[key];
return result;
}, {});
var newImages = mapper(images, (value) => value);
これらの関数の仕組みは次のようになります。
mapFn は、後で追加される関数 (この場合 (value) => value) を取り、そこに格納されているものをそのキーの値として単純に返します (または、彼のように戻り値を変更した場合は 2 倍します)。 obj)[キー]、
次に、result[key] = mapFn(obj)[key] でキーに関連付けられた元の値を再定義します。
結果に対して実行された操作を返します (.reduce 関数の最後で開始された括弧内にあるアキュムレータ)。
これはすべて、選択したオブジェクトに対して実行されていますが、返された配列に対する暗黙的な要求はまだありません。私が知る限り、値を再割り当てする場合にのみ機能します。これには多少の頭の体操が必要ですが、上記のように必要なコード行が減ります。出力は、以下に示すものとまったく同じです。
{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"}
これはNON-NUMBERSで機能することに注意してください。mapFN 関数で値を単純に返すことで、任意のオブジェクトを複製できます。