web-dev-qa-db-ja.com

なぜes6 Setプロトタイプを使用するのですか-> 'entries'

mdnの「Set」ドキュメント によれば、entriesは便利なメソッドとして提供されています

... APIをMapオブジェクトと同様に保つために、各エントリのキーと値は同じ値になっているため、配列[値、値]が返されます。

私の質問は、この場合にAPIを同様に保つ目的は何ですか?つまり、セットに対してメソッドentriesを使用するのはいつですか?

6
aaaaaa

SetMapのAPIは、格納されている値が少し異なります。 Setsには値のみが含まれますが、Mapsには関連するキーも含まれます。

このため、両方の構造にfiltermapforEach、... Arrayと同様の関数がある場合、アクション設定は約具体的には、各反復値は少し異なる可能性があります。

Map: function(key, value) { }
Set: function(value) { }

Mapにすでにキーを保持している場合は、反復中にkeyの値も検査できるのは当然です。


ここで、2つのコレクションのいずれかを反復処理したいが、値のみを考慮したい状況が発生した場合、各データコレクションに1つずつ、合計2つの関数が必要になります。

map.forEach((key, value) => console.log(value));
set.forEach(value => console.log(value));

値のみを考慮し、両方のアクションのロジックは明らかに同じであっても、両方のコレクションを提供する関数を作成することはできません。 entriesSetの両方のMapメソッドは、共通のインターフェイスを提供することでこの問題を修正します。

次の関数(またはその代替手段)を作成することにより、私はあからさまにJS開発者ではないので、不正確な点はご容赦ください。

function forEach(entriesIterator, action) {
    let current = entriesIterator.next();
    while (current.done === false) {
        action(current.value[1]);

        current = entriesIterator.next();
    }
}

entries/Mapおよび/またはSetのいずれかをフィードしても、引き続き機能します。

forEach(map.entries(), value => console.log(value));
forEach(set.entries(), value => console.log(value));

TLDR:entriesメソッドは、潜在的に値のみを気にする可能性があるデータコレクションを反復する抽象化を提供します。

3
Andy