Как конвертировать Set в массив?

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

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

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

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

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

Ответ 1

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

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

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

let array = Array.from(mySet);

Просто spreading Set out в массив

let array = [...mySet];

Старый способ, итерация и добавление в новый массив (в наборах есть forEach)

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

Ранее с использованием нестандартного, а теперь и устаревшего синтаксиса понимания массива:

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

Ответ 2

через https://speakerdeck.com/anguscroll/es6-uncensored Ангусом Кроллом

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

var myArr = [...mySet];

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

var myArr = Array.from(mySet);

Ответ 3

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

_.uniq([])

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

Ответ 4

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

var arrayFromSet = [...set];

Ответ 5

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

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)

Ответ 6

В моем случае решение было:

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

значение1 равно значению2 => Значение, содержащееся в текущей позиции в наборе. Для обоих аргументов передается одинаковое значение

Работал под IE11.

Ответ 7

Использование 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));