セットを配列に変換する方法は?


469

Setは、一意の要素が保証された配列を作成するための優れた方法のように見えますが、ジェネレーター[Set] .valuesを除いて、プロパティを取得するための適切な方法を公開していませんmySet.values.next()

mapセットで同様の関数を呼び出すことができれば、これで問題ありません。しかし、それもできません。

私は試しましたがArray.from、配列のような(NodeListとTypedArrays?)オブジェクトのみをArrayに変換しているようです。別の試み:Object.keysSetでは機能せず、Set.prototypeにも同様の静的メソッドがありません。

それで、質問:与えられたセットの値を持つ配列を作成するための便利な組み込みメソッドはありますか?(要素の順序は重要ではありません)。

そのようなオプションが存在しない場合、おそらくそれを行うための素晴らしい慣用的なワンライナーがありますか?のように、を使用してfor...of、または同様の?

回答:


850

そのようなオプションが存在しない場合、おそらくそれを行うための素晴らしい慣用的なワンライナーがありますか?のように、for ... of、または同様のものを使用していますか?

実際、セット配列に変換する方法はいくつかあります。

を使用して Array.from

let array = Array.from(mySet);

単にspreading配列で設定します

let array = [...mySet];

古い方法で、反復して新しい配列にプッシュします(セットにはありますforEach

let array = [];
mySet.forEach(v => array.push(v));

以前は非標準で、現在は非推奨の配列内包構文を使用しています。

let array = [v for (v of mySet)];

7
これはSafari(8)またはChrome(41)では機能しません。ただし、Firefox(35)では機能します。
425nesp 2015

2
var array = [v for (v of mySet)];Chrome 46 では機能しません
Eric

18
最もエレガントな方法は単純だと思います[...mySet]
Wojciech Bednarski 2016年

18
@WojciechBednarski l33tはエレガントではありません。例のいずれかがそうであれば、それはArray.from(mySet);
Buffalo

3
[...mySet]Typescriptを使用してコンパイルしたときに問題が発生することを追加したかっただけなので(この問題を参照)、Array.from(mySet)近い将来Typescriptに変換する場合はおそらく安全です。
Ivan Gozali

65

Angus Crollによるhttps://speakerdeck.com/anguscroll/es6-uncensored経由

結局のところ、spread演算子を使用できます。

var myArr = [...mySet];

または、代わりに次を使用しますArray.from

var myArr = Array.from(mySet);

1
なぜ反対票?このアプローチに問題はありますか?または誰かがこのコードをIE11で実行しようとして失敗しましたか?;)
c69 2014年

6
私は反対票を投じなかったが、最新バージョンのChromeでこれを試して失敗したので、それは単なるIEの問題ではない。
Meshaal 2015年

3
最新のサポートチャートについては、kangax.github.io / compat - table / es6を参照してください。現在、すべてのデスクトップブラウザのみFFとIE TP(スパルタン別名、別名MS非IEブラウザ)のサポートのArray.from...
C69

Firefoxがサポートする唯一のブラウザのようArray.fromです。developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
425nesp

1
ここでは、Chromeに対して有効にすることができます。chrome://flags/#enable-javascript-harmony実験的なものであることを思い出してください。これは、これが開発のための優れたソリューションであるとは考えていません。
sospedra 2015年

12

Set配列の一意の値を取得するために一時的に使用していて、配列に変換し直していると仮定して、これを使用してみてください:

_.uniq([])

これは、アンダースコアまたはlo-dashの使用に依存しています


残念ながら、唯一のクロスブラウザーソリューション
Marco Sulla

6

パーティーに遅刻するかもしれませんが、次のようにすることができます。

const set = new Set(['a', 'b']);
const values = set.values();
const array = Array.from(values);

これは、ES6をサポートするブラウザーで問題なく機能するか、または上記の機能を正しくポリフィルするシムがある場合に機能します。

編集:今日は、@ c69の提案をそのまま使用できます。

const set = new Set(['a', 'b']);
const array = [...set]; // or Array.from(set)

1
を使用set.entries()すると、ペアの配列を取得するようです。を使用set.values()して、単純な配列を取得できます。
Shimon Rachlenko 2016年

@ShimonRachlenko true、ユーザーはそれを要求しました。
Roland

2
そのまま使用できますvar array = Array.from(set);
Buffalo

この答えは間違っています。.entriesやの呼び出しは必要ありません.values。上記の@バッファローのように- Array.from(set)十分です。
c69

1
@ c69それは本当です。この回答の時点ではArray.from()、期待どおりに動作しませんでした。しかし、今は広がり、Array.from()どちらもうまくいきます。
ローランド



0

Setを使用して配列に変換することは、配列をコピーすることに非常に似ています...

そのため、ES6では非常に簡単な同じ方法で配列をコピーできます。

たとえば、 ...

以下にこのセットがあると想像してください:

const a = new Set(["Alireza", "Dezfoolian", "is", "a", "developer"]);

あなたは単にそれを使ってそれを変換することができます:

const b = [...a];

結果は次のとおりです。

["Alireza", "Dezfoolian", "is", "a", "developer"]

配列と、配列に使用できるすべてのメソッドを使用できるようになりました...

それを行う他の一般的な方法:

const b = Array.from(a);

または次のようなループを使用します:

const b = [];
a.forEach(v => b.push(v));

0

以下のコードは、配列からセットを作成し、次に...演算子を使用します。

var arr=[1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,];
var set=new Set(arr);
let setarr=[...set];
console.log(setarr);

コードをコメント化してください。
ヒマ

1
..そしてこれは何ですか?
ZF007 2019

-1

これは、配列から一意の生の値のみを取得する簡単な方法です。配列をSetに変換し、その後、Setから配列に変換します。この変換は生の値に対してのみ機能し、配列内のオブジェクトに対しては無効です。ご自分でお試しください。

    let myObj1 = {
        name: "Dany",
        age: 35,
        address: "str. My street N5"
    }

    let myObj2 = {
        name: "Dany",
        age: 35,
        address: "str. My street N5"
    }

    var myArray = [55, 44, 65, myObj1, 44, myObj2, 15, 25, 65, 30];
    console.log(myArray);

    var mySet = new Set(myArray);
    console.log(mySet);

    console.log(mySet.size === myArray.length);// !! The size differs because Set has only unique items

    let uniqueArray = [...mySet];
    console.log(uniqueArray); 
    // Here you will see your new array have only unique elements with raw 
    // values. The objects are not filtered as unique values by Set.
    // Try it by yourself.

-1

シンプルな答え

セットを内側に広げるだけです]

let mySet = new Set()
mySet.add(1)
mySet.add(5)
mySet.add(5) 
let arr = [...mySet ]

結果:[1,5]

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.