Gamme Javascript de réduction des plages

Quelle est la meilleure façon de réduire un éventail de gammes dans javascript.

Par exemple, j'ai

1-3,4-5,10-12,2-4 

Le résultat dont j'ai besoin pour cela est

 1-5, 10-12 

Quelle est la meilleure façon d'aborder ce problème?

Je créerais d'abord un autre tableau sans doublons, stockant les nombres couverts par les plages:

 1-3 covers 1, 2, 3 --> [1, 2, 3] 4-5 covers 4, 5 --> [1, 2, 3, 4, 5] 10-12 covers 10, 11, 12 --> [1, 2, 3, 4, 5, 10, 11, 12] 2-4 covers 2, 3, 4 --> [1, 2, 3, 4, 5, 10, 11, 12] 

Puis, trier le tableau:

 [1, 2, 3, 4, 5, 10, 11, 12] // nothing changed in this example 

Enfin, reconstruisez les plages, en fonction des valeurs consécutives:

 1-5 10-12 

1) analysez l'entrée pour créer une structure comme celle-ci:

 var rlist = [ {min: 1, max: 3}, {min: 4, max: 5}, {min: 10, max: 12} {min: 2, max: 4} ]; 

2) margez chaque intervalle de cette liste dans une nouvelle liste:

 var olist = [], i, j, r, p, s; for (i = 0; i < rlist.length; ++i) { r = rlist[i]; for (j = 0; j < olist.length; ) { p = olist[j]; if (r.max+1 < p.min) { // insert here break; } else if (p.max+1 >= r.min) { // intersection olist.splice(j, 1); r.min = p.min; r.max = Math.max(r.max, p.max); } else { ++j; } } olist.splice(j, 0, r); } 

3) Convertir le résultat en une chaîne

 s = ""; for (j = 0; j < olist.length; ++j) { if (j > 0) { s += ","; } s += olist[j].min + "-" + olist[j].max; } 

Violon