Làm cách nào để chuyển đổi Set thành Array?


469

Đặt có vẻ như là một cách hay để tạo Mảng với các yếu tố duy nhất được đảm bảo, nhưng nó không phơi bày bất kỳ cách tốt nào để có được các thuộc tính, ngoại trừ trình tạo [Set] .values, được gọi theo cách khó xử mySet.values.next().

Điều này sẽ ổn thôi, nếu bạn có thể gọi mapvà các chức năng tương tự trên Bộ. Nhưng bạn không thể làm điều đó, là tốt.

Tôi đã thử Array.from, nhưng dường như chỉ chuyển đổi các đối tượng giống như mảng (NodeList và TypedArrays?) Thành Array. Một lần thử khác: Object.keyskhông hoạt động đối với Bộ và Set.prototype không có phương thức tĩnh tương tự.

Vì vậy, câu hỏi: Có phương pháp sẵn có nào thuận tiện để tạo Mảng với các giá trị của Tập hợp đã cho không? (Thứ tự của yếu tố không thực sự quan trọng).

Nếu không có tùy chọn như vậy tồn tại, thì có lẽ có một thành ngữ tốt đẹp để làm điều đó? thích, sử dụng for...of, hoặc tương tự?

Câu trả lời:


850

Nếu không có tùy chọn như vậy tồn tại, thì có lẽ có một thành ngữ tốt đẹp để làm điều đó? thích, sử dụng cho ... của, hoặc tương tự?

Thật vậy, có một số cách để chuyển đổi Set thành Mảng :

sử dụng Array.from

let array = Array.from(mySet);

Đơn giản chỉ spreadinglà Đặt ra trong một mảng

let array = [...mySet];

Cách thức thời trang cũ, lặp đi lặp lại và đẩy sang một mảng mới (Bộ có forEach)

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

Trước đây, sử dụng cú pháp hiểu mảng không chuẩn và hiện không dùng nữa:

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

7
Điều này không hoạt động trong Safari (8) hoặc Chrome (41). Nhưng nó không hoạt động trong Firefox (35).
425nesp

2
var array = [v for (v of mySet)];không hoạt động trong chrome 46
Eric

18
Tôi nghĩ rằng cách thanh lịch nhất là đơn giản [...mySet].
Wojciech Bednarski

18
@WojciechBednarski l33t không thanh lịch . Nếu bất kỳ ví dụ nào là như vậy, thì đó làArray.from(mySet);
Buffalo

3
Chỉ muốn thêm [...mySet]có vấn đề khi được biên dịch bằng Bản mô tả (xem vấn đề này ), vì vậy có thể an toàn hơn để sử dụng Array.from(mySet)nếu bạn có ý định chuyển đổi sang Bản mô tả trong tương lai gần.
Ivan Gozali

65

thông qua https://speakerdeck.com/anguscroll/es6- được kiểm duyệt bởi Angus Croll

Hóa ra, chúng ta có thể sử dụng spreadtoán tử:

var myArr = [...mySet];

Hoặc, cách khác, sử dụng Array.from:

var myArr = Array.from(mySet);

1
Tại sao một downvote? Có bất kỳ vấn đề với phương pháp này? Hoặc ai đó đã cố thực thi mã này trong IE11 và thất bại ? ;)
c69

6
Tôi đã không downvote, nhưng tôi đã thử điều này trong phiên bản Chrome mới nhất và đã thất bại, vì vậy đây không chỉ là vấn đề về IE.
Meshaal

3
tham khảo kangax.github.io/compat-table/es6 để biết thêm hoặc ít hơn biểu đồ hỗ trợ cập nhật. Hiện tại, trong tất cả các trình duyệt trên máy tính để bàn, chỉ có FF và IE TP (còn gọi là Spartan, hay còn gọi là trình duyệt MS Non-IE) Array.from...
c69

Có vẻ như Firefox là trình duyệt duy nhất hỗ trợ Array.from. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
triệt

1
Tại đây, bạn có thể kích hoạt nó cho Chrome chrome://flags/#enable-javascript-harmonyHãy nhớ rằng đây là thử nghiệm, đừng nghĩ rằng đây là một giải pháp tốt để phát triển.
sospedra

12

Giả sử bạn chỉ đang sử dụng Settạm thời để nhận các giá trị duy nhất trong một mảng và sau đó chuyển đổi trở lại thành một mảng, hãy thử sử dụng điều này:

_.uniq([])

Điều này phụ thuộc vào việc sử dụng dấu gạch dưới hoặc lo-dash .


Thật không may là giải pháp xuyên suốt duy nhất
Marco Sulla

6

Có lẽ đến trễ bữa tiệc, nhưng bạn chỉ có thể làm như sau:

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

Điều này sẽ hoạt động mà không gặp vấn đề gì trong các trình duyệt có hỗ trợ ES6 hoặc nếu bạn có một shim chính xác thì hoàn thành chức năng trên.

Chỉnh sửa : Hôm nay bạn chỉ có thể sử dụng những gì @ c69 gợi ý:

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

1
Có vẻ như sử dụng set.entries()bạn sẽ nhận được các cặp. Bạn có thể sử dụng set.values()để có được mảng đơn giản.
Shimon Rachlenko

@ShimonRachlenko đúng, và người dùng đã yêu cầu điều đó.
Roland

2
Bạn chỉ có thể sử dụngvar array = Array.from(set);
Buffalo

Câu trả lời này chỉ sai. Bạn không cần cuộc gọi đến .entries, cũng không .values. Như @Buffalo đã đề cập ở trên - Array.from(set)là đủ.
c69

1
@ c69 đó là sự thật. Tại thời điểm trả lời này, Array.from()không hoạt động như mong đợi. Nhưng bây giờ lan rộng và Array.from()cả hai hoạt động tốt.
Roland

4

Sử dụng toán tử trải rộng để có kết quả mong muốn của bạn

var arrayFromSet = [...set];

0

Trong trường hợp của tôi, giải pháp là:

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 bằng value2 => Giá trị được chứa ở vị trí hiện tại trong Set. Giá trị tương tự được truyền cho cả hai đối số

Làm việc theo IE11.


0

Sử dụng Đặt và chuyển đổi nó thành một mảng rất giống với sao chép một mảng ...

Vì vậy, bạn có thể sử dụng các phương thức tương tự để sao chép một mảng rất dễ dàng trong ES6

Ví dụ: bạn có thể sử dụng ...

Hãy tưởng tượng bạn có Bộ này dưới đây:

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

Bạn chỉ có thể chuyển đổi nó bằng cách sử dụng:

const b = [...a];

và kết quả là:

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

Một mảng và bây giờ bạn có thể sử dụng tất cả các phương thức mà bạn có thể sử dụng cho một mảng ...

Những cách phổ biến khác để làm điều đó:

const b = Array.from(a);

hoặc sử dụng các vòng lặp như:

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

0

Mã dưới đây tạo ra một tập hợp từ một mảng và sau đó, bằng cách sử dụng ...toán tử.

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);

Hãy bình luận xuống mã của bạn.
Hima

1
..và đây là gì?
ZF007

-1

Đây là một cách dễ dàng để chỉ nhận các giá trị thô duy nhất từ ​​mảng. Nếu bạn chuyển đổi mảng thành Set và sau này, hãy thực hiện chuyển đổi từ Set thành mảng. Chuyển đổi này chỉ hoạt động cho các giá trị thô, đối với các đối tượng trong mảng, nó không hợp lệ. Hãy thử nó một mình.

    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

TRẢ LỜI ĐƠN GIẢN

chỉ cần trải bộ bên trong []

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

Kết quả : [1,5]

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.