Tableau JavaScript à définir

145

MSDN fait référence à l' abstraction de la collection Set de JavaScript . J'ai un tableau d'objets que je voudrais convertir en un ensemble afin de pouvoir supprimer ( .delete()) divers éléments par nom:

var array = [
    {name: "malcom", dogType: "four-legged"},
    {name: "peabody", dogType: "three-legged"},
    {name: "pablo", dogType: "two-legged"}
];

Comment convertir ce tableau en un ensemble? Plus précisément, est-il possible de le faire sans itérer sur le tableau ci-dessus? La documentation est relativement insuffisante (suffisante pour les ensembles instanciés; pas pour les conversions - si possible).

Je pense peut-être aussi à la conversion en Map , pour suppression par clé. Ce que j'essaie d'accomplir, c'est une collection itérative qui peut être consultée ou modifiée en accédant aux éléments principalement via une clé (par opposition à l'index).

La conversion d'un tableau à l'autre étant le but ultime.

Thomas
la source
1
sonne comme un vieil objet ordinaire fonctionnera pour vous ...
dandavis
3
@Thomas: il me manque donc quelque chose que je veux apprendre. Quelle est la différence entre var s = new Set (), ajouter des objets et émettre s.delete (peu importe) - et var o = {1: 'aaa', 2: 'bbbb' ...} et émettre delete (o [ '1']) ?
Veverke
1
@Veverke qui était plus descriptif que votre commentaire initial (+1). Je vous remercie. Mais, encore une fois, est-il possible de faire cela sans itérer sur le tableau pour ajouter le contenu du tableau à l'objet et de conserver une structure de type liste, accessible par clé? On dirait que vous avez une idée. Cela ne me dérangerait pas de le voir dans un format de réponse si vous avez le temps d'élaborer.
Thomas
2
Cet objet de tableau n'est pas légal, car {"bob", "dole"}n'est pas un objet valide.
Alnitak
1
@Veverke ES6 Setet Mapsont une implémentation "pure" de ces constructions de données qui ne souffrent pas des problèmes qu'un Objectpeut rencontrer lorsque des éléments sont ajoutés à son prototype.
Alnitak

Réponses:

206

Passez simplement le tableau au constructeur Set. Le constructeur Set accepte un iterableparamètre. L'objet Array implémente le iterableprotocole, c'est donc un paramètre valide.

var arr = [55, 44, 65];
var set = new Set(arr);
console.log(set.size === arr.length);
console.log(set.has(65));

Vois ici

levi
la source
strictement correct, même si j'ai hésité à ajouter moi-même une réponse car les données de l'OP sont mal formées et on ne sait donc pas exactement ce qu'il attend
Alnitak
10
Cela ne fonctionne pas sur IE11. Il ne prend pas en charge ce constructeur. Je l'éviterais à moins que vous ne sachiez quels navigateurs vos utilisateurs vont utiliser.
Eric
10

Si vous commencez par:

let array = [
    {name: "malcom", dogType: "four-legged"},
    {name: "peabody", dogType: "three-legged"},
    {name: "pablo", dogType: "two-legged"}
];

Et vous voulez un ensemble de, disons, des noms, vous feriez:

let namesSet = new Set(array.map(item => item.name));
Ryan Shillington
la source
3

Ce que levi a dit à propos de sa transmission au constructeur est correct, mais vous pouvez également utiliser un objet.

Je pense que ce que Veverke essaie de dire, c'est que vous pouvez facilement utiliser le deletemot - clé sur un objet pour obtenir le même effet.

Je pense que vous êtes confus par la terminologie; Les propriétés sont des composants de l'objet que vous pouvez utiliser comme indices nommés (si vous voulez y penser de cette façon).

Essayez quelque chose comme ceci:

var obj = {
    "bob": "dole",
    "mr.": "peabody",
    "darkwing": "duck"
};

Ensuite, vous pouvez simplement faire ceci:

delete obj["bob"];

La structure de l'objet serait alors la suivante:

{
    "mr.": "peabody",
    "darkwing": "duck"
}

Ce qui a le même effet.

AstroCB
la source
1
Merci Astro :-). En effet, cela a ouvert la question: "quelle est la différence entre un objet Set et un objet simple"? Bien que, comme je l'ai noté dans les commentaires ci-dessus, "Set" est un type de conclusion qui offre la "fonctionnalité agréable d'avoir" de "clear".
Veverke
En bref, je pense que le titre du message devrait être changé en "Quelle est la différence entre un objet Set et un objet simple en javascript", et notez que "En essayant de réaliser ceci et cela ... j'ai fini par me demander Quelle est la différence entre ...
Veverke
@Veverke "quelle est la différence entre un objet Set et un objet simple", pourrait juste lire le doc ..
Hacketo
1
@Hacketo: trouvez-vous autre que Set fournissant "Clear" dans son api?
Veverke
1
C'est une réponse intéressante - pensez qu'elle mérite plus de crédit qu'elle n'en a reçu. M'a fait réfléchir. Je vous remercie!
Thomas
2

Par définition, "Un ensemble est une collection de valeurs, où chaque valeur ne peut apparaître qu'une seule fois". Ainsi, si votre tableau a des valeurs répétées, une seule valeur parmi les valeurs répétées sera ajoutée à votre ensemble.

var arr = [1, 2, 3];
var set = new Set(arr);
console.log(set); // {1,2,3}


var arr = [1, 2, 1];
var set = new Set(arr);
console.log(set); // {1,2}

Donc, ne convertissez pas en set si vous avez des valeurs répétées dans votre tableau.

Ashlesh Sortee
la source