web-dev-qa-db-fra.com

Comment convertir Set en Array?

Set semble être un bon moyen de créer des tableaux contenant des éléments uniques garantis, mais il n’expose aucun bon moyen d’obtenir des propriétés, sauf pour le générateur [Set] .values, appelé de manière maladroite avec mySet.values.next().

Cela aurait été correct si vous pouviez appeler map et des fonctions similaires sur les ensembles. Mais vous ne pouvez pas faire cela aussi.

J'ai essayé Array.from, mais semble ne convertir que des objets de type tableau (NodeList et TypedArrays?) En tableau. Une autre tentative: Object.keys ne fonctionne pas pour les ensembles et Set.prototype n'a pas de méthode statique similaire.

Donc, la question: Existe-t-il une méthode intégrée pratique pour créer un tableau avec les valeurs d’un ensemble donné? (L'ordre des éléments n'a pas vraiment d'importance).

si une telle option n'existe pas, alors il existe peut-être une ligne idiomatique Nice pour le faire? comme, en utilisant for...of, ou similaire?

355
c69

si aucune option de ce type n'existe, alors il existe peut-être un idiomatique de Nice une seule ligne pour le faire? comme, en utilisant pour ... ou similaire?

En effet, il existe plusieurs façons de convertir un Set en un Array

using Array.from

let array = Array.from(mySet);

Simply spreading the Exposer dans un tableau

let array = [...mySet];

À l'ancienne, itération et insertion dans un nouveau tableau (les ensembles ont forEach)

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

Auparavant, en utilisant la syntaxe de compréhension de tableau non standard et désormais déconseillée:

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

via https://speakerdeck.com/anguscroll/es6-uncensored de Angus Croll

En fin de compte, nous pouvons utiliser l'opérateur spread:

var myArr = [...mySet];

Ou, alternativement, utilisez Array.from :

var myArr = Array.from(mySet);
58
c69

En supposant que vous n'utilisiez que Set temporairement pour obtenir des valeurs uniques dans un tableau, puis reconvertissez-les en tableau, essayez ceci:

_.uniq([])

Cela repose sur l’utilisation de underscore ou lo-dash .

10
fremn

Utilisez spread operator pour obtenir le résultat souhaité.

var arrayFromSet = [...set];
4
Vignesh Murugan

Peut-être trop tard pour la fête, mais vous pouvez simplement faire ce qui suit:

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

Cela devrait fonctionner sans problème dans les navigateurs prenant en charge ES6 ou si vous avez une cale qui remplit correctement les fonctions ci-dessus.

Edit : Aujourd'hui, vous pouvez simplement utiliser ce que @ c69 suggère:

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

Dans mon cas, la solution était:

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

valeur1 est égal à valeur2 => La valeur contenue dans la position actuelle dans l'ensemble. La même valeur est passée pour les deux arguments

A travaillé sous IE11.

0
d0wn

Utiliser Set et le convertir en tableau est très similaire à la copie d’un tableau ...

Vous pouvez donc utiliser les mêmes méthodes pour copier un tableau, ce qui est très facile dans ES6

Par exemple, vous pouvez utiliser ...

Imaginez que vous avez cet ensemble ci-dessous:

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

Vous pouvez simplement le convertir en utilisant:

const b = [...a];

et le résultat est: 

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

Un tableau et maintenant vous pouvez utiliser toutes les méthodes que vous pouvez utiliser pour un tableau ...

Autres façons courantes de le faire:

const b = Array.from(a);

ou en utilisant des boucles comme:

const b = [];
a.forEach(v => b.Push(v));
0
Alireza