Как преобразовать Set в Array?

Set кажется хорошим способом создания массивов с гарантированными уникальными элементами, но он не предоставляет никакого хорошего способа получить свойства, за исключением генератора [Set].значения, которые вызываются неудобным способом mySet.values.next().

Это было бы нормально, если бы вы могли позвонить map и аналогичные функции на множествах. Но вы не можете сделать и этого.

Я пробовал Array.from, но, похоже, преобразует только массив (NodeList и TypedArrays ?) объекты Матрица. Еще одна попытка:Object.keys не работает для наборов, а Set.прототип не имеет аналогичного статического метода.

Итак, вопрос: есть ли удобный встроенный метод для создания массива со значениями из заданного набора ? (порядок элементов не имеет значения).

если такой вариант не существует, то, может быть, есть хороший идиоматический однострочный для этого ? например, используя for...of, или похожие ?

5 ответов


если такой опции не существует, то, возможно, есть хороший идиоматический один лайнер за это ? типа, использовать для...или похожие ?

действительно, есть несколько способов конвертировать Set до массив:

используя Array.from

let array = Array.from(mySet);

просто spreading набор в массив

let array = [...mySet];

старый способ моды, итерация и нажатие на новый массив (наборы имеют forEach)

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

использование fancier for...of loop (это, похоже, больше не работает в Chrome)

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

via https://speakerdeck.com/anguscroll/es6-uncensored Ангус Кролл

оказывается, мы можем использовать spread оператор:

var myArr = [...mySet];

или, альтернативно, использовать Array.from:

var myArr = Array.from(mySet);

предполагая, что вы просто используете Set временно, чтобы получить уникальные значения в массиве, а затем преобразовать обратно в массив, попробуйте использовать следующее:

_.uniq([])

Это зависит от использования подчеркивание или Ло-тире.


Используйте оператор spread, чтобы получить желаемый результат

var arrayFromSet = [...set];

возможно, опоздал на вечеринку, но вы могли бы просто сделать следующее:

let set = new Set();
let arrayLike = set.entries(); // for an array of [[key, value]] pairs
// let arrayLike = set.values(); // for an array of [value]
let array = Array.from(arrayLike);

Это должно работать без проблем в браузерах, которые имеют поддержку ES6 или если у вас есть прокладка, которая правильно прокладывает вышеуказанную функциональность.