2015-10-12 12 views
23

new Set(['b', 'a', 'c']).sort() genera TypeError: set.sort is not a function. Come posso ordinare uno Set per garantire un ordine di iterazione particolare?Come posso ordinare un `Set` ES6?

+5

set sono non ordinata. – SLaks

+0

@SLaks forse lo sono, ma mi piacerebbe essere in grado di sfruttare il vantaggio delle chiavi univoche che l'offerta di 'Set's, pur essendo ancora in grado di ordinare gli elementi. Java offre ['SortedSet's] (http://docs.oracle.com/javase/7/docs/api/java/util/SortedSet.html), posso solo presumere che l'abbiano fatto perché qualcuno ha offerto un caso d'uso valido ... ES6 non dovrebbe essere Java, ma i set di ordinamento sembrano utili. – ericsoco

+0

Non è possibile nemmeno 'sort()' a 'SortedSet'. Usa una struttura ad albero che consente l'attraversamento in ordine, ma non puoi * cambiare * questo ordine come con un 'ArrayList'. Se si desidera modificare l'ordine, utilizzare gli elenchi. –

risposta

47

Un set non è una struttura di dati astratta ordinata.

A Set tuttavia ha sempre lo stesso ordine di iterazione - ordine di inserimento elementi [1], quindi quando lo si itera (con un metodo di iterazione, chiamando Symbol.iterator, o con un ciclo for ..) si può sempre prevedere che .

È sempre possibile convertire il set in un array e ordinarlo.

Array.from(new Set(["b","a","c"])).sort(); 
[...(new Set(["b","a","c"]))].sort(); // with spread. 

[1] forEach e CreateSetIterator

+2

Ho cancellato la mia risposta che è la stessa, ma aggiungerò il mio commento: "Spero davvero che qualcuno possa fornire una risposta che non richiede andare da' Set' a 'Array' e ritorno. Sembra piuttosto inefficiente ". – ericsoco

+6

@ericsoco le specifiche ECMAScript non specificano un 'OrderedSet' ma una struttura di dati simile esiste in più altre lingue, tipicamente implementate da un albero. È possibile utilizzare una libreria di raccolte di userland, ovvero: il popolare ImmutableJS fornisce un ['OrderedSet'] (https://facebook.github.io/immutable-js/docs/#/OrderedSet). In effetti, questo sarà probabilmente più efficiente in molti casi. Quindi, se hai un set con oltre 100K elementi, preferirei sicuramente utilizzare l'implementazione di un set ordinato. –

+0

Si noti che per set di numeri è necessario fornire una funzione di confronto: '(x, y) => x - y'. I tuoi numeri saranno ordinati lessicograficamente altrimenti. – neo

Problemi correlati