Comment convertir Set en tableau?

469

Set semble être une bonne façon de créer des tableaux avec des éléments uniques garantis, mais il n'expose aucun bon moyen d'obtenir des propriétés, à l'exception du générateur [Set] .values, qui est appelé de manière maladroite mySet.values.next().

Cela aurait été correct si vous aviez pu appeler mapet des fonctions similaires sur les sets. Mais vous ne pouvez pas faire cela aussi.

J'ai essayé Array.from, mais semble convertir uniquement des objets de type tableau (NodeList et TypedArrays?) En tableau. Un autre essai: Object.keysne 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 des valeurs d'un ensemble donné? (L'ordre des éléments n'a pas vraiment d'importance).

si une telle option n'existe pas, alors peut-être y a-t-il une belle doublure idiomatique pour le faire? comme, en utilisantfor...of ou similaire?

c69
la source

Réponses:

851

si une telle option n'existe pas, alors peut-être y a-t-il une belle doublure idiomatique pour le faire? comme, pour ... ou similaire?

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

en utilisant Array.from

let array = Array.from(mySet);

Simplement spreadingle mettre en réseau

let array = [...mySet];

L'ancienne façon, itérer et pousser vers 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 obsolète:

let array = [v for (v of mySet)];
adeneo
la source
7
Cela ne fonctionne pas dans Safari (8) ou Chrome (41). Mais cela fonctionne dans Firefox (35).
425nesp
2
var array = [v for (v of mySet)];ne fonctionne pas en chrome 46
Eric
18
Je pense que la façon la plus élégante est tout simplement [...mySet].
Wojciech Bednarski
18
@WojciechBednarski l33t n'est pas élégant . Si l'un des exemples est celui-ci, c'estArray.from(mySet);
Buffalo
3
Je voulais juste ajouter des [...mySet]problèmes lors de la compilation à l'aide de Typescript (voir ce problème ), donc probablement plus sûr à utiliser Array.from(mySet)si vous avez l'intention de convertir en Typescript dans un proche avenir.
Ivan Gozali
65

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

Il s'avère que nous pouvons utiliser l' spreadopérateur:

var myArr = [...mySet];

Ou bien, utilisez Array.from:

var myArr = Array.from(mySet);
c69
la source
1
pourquoi un downvote? y a-t-il des problèmes avec cette approche? Ou quelqu'un a essayé d'exécuter ce code dans IE11 et a échoué ? ;)
c69
6
Je n'ai pas déçu, mais j'ai essayé cela dans la dernière version de Chrome et j'ai échoué, donc ce n'est pas seulement un problème IE.
Meshaal
3
reportez-vous à kangax.github.io/compat-table/es6 pour un tableau de support plus ou moins à jour. Actuellement, de tous les navigateurs de bureau, seuls FF et IE TP (aka Spartan, aka MS Non-IE browser) prennent en charge Array.fromet...
c69
Il semble que Firefox soit le seul navigateur à prendre en charge Array.from. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
425nesp
1
Ici, vous pouvez l'activer pour Chrome chrome://flags/#enable-javascript-harmonyN'oubliez pas que c'est expérimental, ne pensez pas pour le moment qu'il s'agit d'une bonne solution de développement.
sospedra
12

En supposant que vous utilisez simplement Settemporairement pour obtenir des valeurs uniques dans un tableau, puis reconvertissez en tableau, essayez d'utiliser ceci:

_.uniq([])

Cela repose sur l'utilisation de soulignement ou de tiret bas .

fremn
la source
Malheureusement, la seule solution croisée
Marco Sulla
6

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 un module d'interface qui remplit correctement les fonctionnalités 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)
Roland
la source
1
Il semble qu'en utilisant le, set.entries()vous obtiendrez un tableau de paires. Vous pouvez utiliser set.values()pour obtenir le tableau simple.
Shimon Rachlenko
@ShimonRachlenko true, et l'utilisateur l'a demandé.
Roland
2
Vous pouvez simplement utiliservar array = Array.from(set);
Buffalo
cette réponse est tout simplement fausse. Vous n'avez pas besoin d'appeler .entries, ni .values. Comme @Buffalo l'a mentionné ci-dessus - Array.from(set)c'est suffisant.
c69
1
@ c69 c'est vrai. Au moment de cette réponse, Array.from()n'a pas fonctionné comme prévu. Mais maintenant étalé et les Array.from()deux fonctionnent très bien.
Roland
4

Utilisez l'opérateur spread pour obtenir le résultat souhaité

var arrayFromSet = [...set];
Vignesh Murugan
la source
0

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 transmise pour les deux arguments

A travaillé sous IE11.

d0wn
la source
0

L'utilisation de Set et sa conversion 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));
Alireza
la source
0

Le code ci-dessous crée un ensemble à partir d'un tableau puis, à l'aide de l' ...opérateur.

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);
Ekram Mallick
la source
Veuillez commenter votre code.
Hima
1
..et c'est quoi?
ZF007
-1

Voici un moyen simple d'obtenir uniquement des valeurs brutes uniques à partir d'un tableau. Si vous convertissez le tableau en ensemble et après cela, effectuez la conversion de l'ensemble en tableau. Cette conversion ne fonctionne que pour les valeurs brutes, pour les objets du tableau, elle n'est pas valide. Essayez-le par vous-même.

    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.
zdrsoft
la source
-1

RÉPONSE LA PLUS SIMPLE

il suffit de répartir l'ensemble à l'intérieur []

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

Résultat : [1,5]

Aljohn Yamaro
la source