Как преобразовать 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([])
Это зависит от использования подчеркивание или Ло-тире.
возможно, опоздал на вечеринку, но вы могли бы просто сделать следующее:
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 или если у вас есть прокладка, которая правильно прокладывает вышеуказанную функциональность.