2017-02-07 1 views
2

Ich habe eine logische Herausforderung und ich frage mich, was wäre beste Praxis oder mögliche Methoden oder Bibliotheken, um das Problem zu lösen.Kombinieren von Zahlenbereichen aus mehreren Werten in Javascript

Lasst uns sagen, es gibt mehrere Arrays wie [10, 20, 30] ["24-30", "45-60"] [34, 35] ["28-33", 90]

Was ich will, ist ein Überblick über die einzelnen Bereiche und unterschiedliche Werte ohne Redundanz. Aus den oberen Arrays sollte also ein einzelnes sortiertes Array mit allen Werten generiert werden, die zu einem logisch geordneten Stream zusammengeführt werden.

beispielsweise für die oberen Werte ich eine Zeichenfolge erwarten

[10, 20, "24-35", "45-60", 90] 

so sollte die Logik erkennt, dass z.B. 30 ist bereits in [24-30] enthalten, dass "28-33" fortfährt und mit "24-30" überschneidet und "28-33" wird um Einzelwerte 34 und 35 fortgesetzt.

Vielleicht kennt jemand eine Bibliothek, die mich unterstützt diese Art von Problem oder kennt eine gute Lösung?

+0

für Bibliothek gefragt ist offtopic. Hast du etwas versucht? –

+0

noch nicht. Bevor ich etwas versuche, suche ich nach möglichen Lösungen und lerne über Erfahrungen von anderen. Ich wäre ziemlich fähig, eine brutale Lösung zu finden, aber vielleicht kann mir jemand etwas eleganteres anbieten, so wie es mir in den Sinn kam –

Antwort

1

Sie könnten einen verketteten Ansatz verwenden, bei dem die Datenstruktur geändert wird und die verbundenen Teile sortiert werden.

var data = [[10, 20, 30], ["24-30", "45-60"], [34, 35], ["28-33", 90]], 
 
    result = data 
 
     .reduce(function (r, a) { 
 
      a.map(function (b) { 
 
       var c = b.toString().split('-') 
 
       c[1] = c[1] || c[0]; 
 
       r.push(c.map(Number)); 
 
      }); 
 
      return r; 
 
     }, []) 
 
     .sort(function (a, b) { return a[0] - b[0] || a[1] - b[1]; }) 
 
     .reduce(function (r, a) { 
 
      var last = r[r.length - 1] || []; 
 
      if (a[0] <= last[1] + 1) { 
 
       if (last[1] < a[1]) { 
 
        last[1] = a[1]; 
 
       } 
 
       return r; 
 
      } 
 
      return r.concat([a]); 
 
     }, []) 
 
     .map(function (a) { 
 
      return a[0] === a[1] ? a[0] : a.join('-'); 
 
     }); 
 
    
 
console.log(result);

+0

das kam so schnell in deinen Kopf? Ich fühle mich gerade blöd. Danke Nina. Das ist genau was ich brauche. –

+0

keine Sorgen. Ich schreibe tatsächlich einen Ansatz, ohne zuerst zu sortieren und der letzte reduzierende Teil war mein Ausgangspunkt. –

Verwandte Themen