1. ホーム
  2. javascript

[解決済み] .map()で要素を読み飛ばすには?

2022-03-15 14:41:46

質問

の配列要素をスキップするにはどうすればよいですか? .map ?

私のコード

var sources = images.map(function (img) {
    if(img.src.split('.').pop() === "json"){ // if extension is .json
        return null; // skip
    }
    else{
        return img.src;
    }
});

これが返ってきます。

["img.png", null, "img.png"]

解決方法は?

ちょうど .filter() を先に入力します。

var sources = images.filter(function(img) {
  if (img.src.split('.').pop() === "json") {
    return false; // skip
  }
  return true;
}).map(function(img) { return img.src; });

もし、そのようなことをしたくないのであれば、それはある程度のコストがかかるので無理なことではありませんが、より一般的な .reduce() . 一般的には、以下のように表現することができます。 .map() という言葉で .reduce :

someArray.map(function(element) {
  return transform(element);
});

は次のように書くことができます。

someArray.reduce(function(result, element) {
  result.push(transform(element));
  return result;
}, []);

そのため、要素をスキップする必要がある場合は、次のように簡単に行うことができます。 .reduce() :

var sources = images.reduce(function(result, img) {
  if (img.src.split('.').pop() !== "json") {
    result.push(img.src);
  }
  return result;
}, []);

そのバージョンでは .filter() の一部が、最初のサンプルの .reduce() のコールバックがあります。画像ソースが結果配列にプッシュされるのは、フィルター操作によって保持される場合のみです。

更新 - この質問には多くの注目が集まるので、次のような明確な指摘を加えたい。の目的は .map() というのは、まさにquot;map"が意味するように、値のリストをある規則に従って別の値のリストに変換することです。ある国の紙の地図に、いくつかの都市が完全に欠落していると奇妙に見えるように、あるリストから別のリストへのマッピングは、結果の値が1対1である場合にのみ、本当に意味をなすのです。

一部の値を除いた古いリストから新しいリストを作成することに意味がないとは言いません。ただ、以下のことを明確にしようとしているのです。 .map() それは、古い配列と同じ長さで、古い値を変換した値だけを含む新しい配列を作るという、ただひとつのシンプルな意図を持っています。