Как преобразовать набор в массив?

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

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

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

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

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

13 ответов

Решение

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

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

с помощьюArray.from

let array = Array.from(mySet);

ПростоspreadingНабор в массив

let array = [...mySet];

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

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

Используя любителяfor...ofцикл (это больше не работает в Chrome)

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

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

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

var myArr = [...mySet];

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

var myArr = Array.from(mySet);

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

_.uniq([])

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

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

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)

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

var arrayFromSet = [...set];

ПРОСТОЙ ОТВЕТ

просто разложите набор внутри []

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

Результат: [1,5]

Приведенный ниже код создает набор из массива, а затем с помощью ... оператор.

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

упрощенный способ сделать это

       const array = [...new Set([1,1,2,3,3,4,5])]
    console.log(array)

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

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.

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

Я бы предпочел начать с удаления дубликатов из массива, а затем попытаться отсортировать. Вернуть 1-й элемент из нового массива.

          function processData(myArray) {
        var s = new Set(myArray);
        var arr = [...s];
        return arr.sort((a,b) => b-a)[1];
    }
    
    console.log(processData([2,3,6,6,5]);

Вот простой способ получить только уникальные необработанные значения из массива. Если вы конвертируете массив в Set и после этого выполняете преобразование из Set в массив. Это преобразование работает только для необработанных значений, для объектов в массиве оно недопустимо. Попробуйте сами.

    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.

Другие вопросы по тегам