Set을 Array로 변환하는 방법?


469

Set 은 유일무이 한 방식으로 호출되는 generator [Set] .values를 제외하고는 고유 한 요소로 배열을 생성하는 좋은 방법 인 것 같지만 속성을 얻는 좋은 방법을 노출시키지 않습니다 mySet.values.next().

map세트에서 비슷한 함수를 호출 할 수 있다면 이것은 좋을 것 입니다. 그러나 당신도 그렇게 할 수 없습니다.

시도 Array.from했지만 배열과 같은 (NodeList 및 TypedArrays?) 객체 만 Array로 변환하는 것 같습니다. 또 다른 시도 : Object.keys세트에서는 작동하지 않으며 Set.prototype에는 비슷한 정적 메소드가 없습니다.

그래서 질문 : 주어진 Set의 값으로 배열을 만드는 편리한 내장 메소드가 있습니까? (요소의 순서는 실제로 중요하지 않습니다).

그러한 옵션이 존재하지 않는다면, 그렇게하기위한 좋은 관용적 인 라이너가 있습니까? 같은, 사용 for...of, 또는 유사한?

답변:


850

그러한 옵션이 존재하지 않는다면, 그렇게하기위한 좋은 관용적 인 라이너가 있습니까? for ... of 또는 이와 유사한 것을 사용 하는가?

실제로 SetArray 로 변환하는 몇 가지 방법이 있습니다 .

사용 Array.from

let array = Array.from(mySet);

간단히 spreading배열로 설정

let array = [...mySet];

구식 방식으로 반복하고 새로운 배열로 푸시 (Sets have forEach)

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

이전에는 비표준이고 더 이상 사용되지 않는 배열 이해 구문을 사용합니다.

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

7
Safari (8) 또는 Chrome (41)에서는 작동하지 않습니다. 그러나 Firefox (35)에서는 작동합니다.
425nesp

2
var array = [v for (v of mySet)];크롬 46 에서 작동하지 않습니다
Eric

18
가장 우아한 방법은 간단하다고 생각합니다 [...mySet].
Wojciech Bednarski 2015 년

18
@WojciechBednarski l33t는 우아 하지 않습니다 . 그 예 중 하나라도 해당된다면Array.from(mySet);
Buffalo

3
[...mySet]Typescript를 사용하여 컴파일 할 때 문제 가있는 것을 추가하고 싶었습니다 ( 이 문제 참조 ) Array.from(mySet). 앞으로 Typescript로 변환하려는 경우 사용 하는 것이 더 안전합니다 .
Ivan Gozali

65

https://speakerdeck.com/anguscroll/es6-uncensored 를 통해Angus Croll의 를

spread연산자 를 사용할 수 있습니다 .

var myArr = [...mySet];

또는 다음을 사용하십시오 Array.from.

var myArr = Array.from(mySet);

1
왜 downvote? 이 방법에 문제가 있습니까? 또는 누군가 IE11 에서이 코드를 실행하려고 시도했지만 실패 했습니까? ;)
c69

6
나는 공감하지 않았지만 최신 버전의 Chrome에서 이것을 시도했지만 실패했기 때문에 IE 문제가 아닙니다.
Meshaal

3
최신 지원 차트 에 대해서는 kangax.github.io/compat-table/es6 을 참조하십시오 . 현재 모든 데스크탑 브라우저 중에서 FF 및 IE TP (일명 MS Non-IE 브라우저라고도하는 Spartan) Array.from...
c69

Firefox가 유일하게 지원하는 브라우저 인 것 같습니다 Array.from. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
425nesp

1
여기에서 Chrome을 사용하도록 설정할 수 있습니다. chrome://flags/#enable-javascript-harmony실험적인 것은 이것이 개발을위한 좋은 솔루션이라고 생각하지 않습니다.
sospedra 2016 년

12

Set일시적으로 배열에서 고유 값을 가져오고 배열로 다시 변환 한다고 가정하면 다음을 사용하십시오.

_.uniq([])

이것은 밑줄 또는 lo-dash 사용에 의존합니다 .


불행히도 유일한 크로스 브로 저 솔루션
Marco Sulla

6

파티에 늦었을 수도 있지만 다음을 수행 할 수 있습니다.

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

ES6를 지원하는 브라우저에서 또는 위 기능을 올바르게 채우는 shim이있는 경우 문제없이 작동합니다.

편집 : 오늘 @ c69가 제안하는 것을 사용할 수 있습니다.

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

1
를 사용하면 set.entries()쌍의 배열을 얻을 것 같습니다 . set.values()일반 배열을 얻는 데 사용할 수 있습니다 .
Shimon Rachlenko

@ ShimonRachlenko true, 사용자가 요청했습니다.
Roland

2
당신은 그냥 사용할 수 있습니다var array = Array.from(set);
Buffalo

이 답변은 잘못되었습니다. 당신은에 대한 호출이 필요하지 않습니다 .entries,도 아니다 .values. @Buffalo가 위에서 언급했듯이 Array.from(set)충분합니다.
c69

1
@ c69 맞습니다. 이 답변 당시 Array.from()예상대로 작동하지 않았습니다. 그러나 이제는 퍼지고 Array.from()둘 다 잘 작동합니다.
Roland


0

내 경우에는 해결책은 다음과 같습니다.

var testSet = new Set();
var testArray = [];

testSet.add("1");
testSet.add("2");
testSet.add("2"); // duplicate item
testSet.add("3");

var someFunction = function (value1, value2, setItself) {
    testArray.push(value1);
};

testSet.forEach(someFunction);

console.log("testArray: " + testArray);

value1은 value2와 같습니다 => 세트의 현재 위치에 포함 된 값입니다. 두 인수 모두에 동일한 값이 전달됩니다.

IE11에서 일했습니다.


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

-1

다음은 배열에서 고유 한 원시 값만 가져 오는 쉬운 방법입니다. 배열을 Set으로 변환 한 후 Set에서 array로 변환하십시오. 이 변환은 원시 값, 배열의 객체에 대해서만 유효합니다. 혼자서 사용해보십시오.

    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.