Matrice JavaScript da impostare


145

MSDN fa riferimento all'astrazione della raccolta Set di JavaScript . Ho una serie di oggetti che vorrei convertire in un set in modo da poterlo rimuovere (.delete() ) vari elementi per nome:

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

Come posso convertire questo array in un set? Più specificamente, è possibile farlo senza iterare sull'array sopra? La documentazione è relativamente carente (sufficiente per insiemi istanziati; non per conversioni - se possibile).

Potrei anche pensare alla conversione in una mappa , per la rimozione tramite chiave. Quello che sto cercando di realizzare è una raccolta iterabile a cui è possibile accedere o modificare accedendo agli elementi principalmente tramite una chiave (al contrario dell'indice).

La conversione da un array all'altro è l'obiettivo finale.


1
suona come un semplice oggetto vecchio funzionerà per te ...
dandavis

3
@Thomas: quindi mi manca qualcosa, che voglio imparare. Qual è la differenza tra var s = new Set (), l'aggiunta di oggetti e l'emissione di s.delete (qualunque sia) - e var o = {1: 'aaa', 2: 'bbbb' ...} e l'emissione di eliminare (o [ '1'])?
Veverke,

1
@Veverke che era più descrittivo del tuo commento iniziale (+1). Grazie. Ma, ancora una volta, è possibile farlo senza iterare sull'array per aggiungere il contenuto dell'array all'oggetto e conservare un elenco come una struttura accessibile dalle chiavi? Sembra che tu abbia un'idea. Non mi dispiacerebbe vederlo in un formato di risposta se hai il tempo di elaborare.
Thomas

2
Quell'oggetto array non è legale, poiché {"bob", "dole"}non è un oggetto valido.
Alnitak,

1
@Veverke ES6 Sete Mapsono un'implementazione "pura" di quei costrutti di dati che non soffrono dei problemi che una Objectlattina quando le cose vengono aggiunte al suo prototipo.
Alnitak,

Risposte:


206

Basta passare l'array al costruttore Set. Il costruttore Set accetta un iterableparametro. L'oggetto Array implementa il iterableprotocollo, quindi è un parametro valido.

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

Vedere qui


rigorosamente corretto, anche se ho esitato ad aggiungere una risposta da solo poiché i dati del PO sono malformati ed è quindi poco chiaro esattamente cosa si aspetta
Alnitak

10
Questo non funziona su IE11. Non supporta questo costruttore. Lo eviterei se non sapessi quali browser utilizzeranno i tuoi utenti.
Eric

10

Se inizi con:

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

E vuoi un set di, diciamo, nomi, che faresti:

let namesSet = new Set(array.map(item => item.name));

3

Che levi detto sul passaggio nel costruttore è corretto, ma potresti anche usare un oggetto.

Penso che Veverke stia cercando di dire che puoi facilmente usare la deleteparola chiave su un oggetto per ottenere lo stesso effetto.

Penso che tu sia confuso dalla terminologia; proprietà sono componenti dell'oggetto che puoi usare come indici nominati (se vuoi pensarlo in quel modo).

Prova qualcosa del genere:

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

Quindi, potresti semplicemente fare questo:

delete obj["bob"];

La struttura dell'oggetto sarebbe quindi questa:

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

Che ha lo stesso effetto.


1
Grazie Astro :-). In effetti, questo ha aperto la domanda: "qual è la differenza tra un oggetto Set e un oggetto semplice"? Anche se, come ho notato nei commenti sopra, "Set" è un tipo di riepilogo che offre il "bello avere funzionalità" di "clear".
Veverke,

In breve, penso che il titolo del post dovrebbe essere cambiato in "Qual è la differenza tra un oggetto Set e un oggetto semplice in javascript", e nota che "Nel tentativo di ottenere questo e quello ... Ho finito per chiedermi qual è la differenza tra ...
Veverke

@Veverke "qual è la differenza tra un oggetto Set e un oggetto semplice", potrebbe semplicemente leggere il documento ..
Hacketo

1
@Hacketo: trovi qualcosa di diverso da Set che fornisce "Clear" nella sua API?
Veverke,

1
Questa è una risposta interessante: pensa che meriti più credito di quello che ha ricevuto. Mi ha fatto pensare. Grazie!
Thomas,

2

Per definizione "Un set è una raccolta di valori, in cui ciascun valore può verificarsi una sola volta." Pertanto, se l'array ha valori ripetuti, al set verrà aggiunto solo un valore tra quelli ripetuti.

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}

Quindi, non convertire in set se hai valori ripetuti nell'array.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.