2017-02-07 6 views
2

私は論理的な挑戦をしており、問題を最も良く解決するためのベストプラクティスまたは可能な方法やライブラリが何か不思議です。Javascriptでいくつかの値の範囲を組み合わせる

のは、私が欲しいもの[10, 20, 30] ["24-30", "45-60"] [34, 35] ["28-33", 90]

のような複数のアレイがあるとしましょうは、冗長性のない単一の範囲と異なる値の概要です。したがって、上位の配列の中では、すべての値を持つ単一のソートされた配列が生成され、論理的に順序付けられたストリームにマージされます。私は

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

そうロジックは、その例えば検出すべきである文字列を期待して、上部の値については、例えば

30はすでに[24-30]に含まれており、「28-33」は継続して「24-30」と重複し、「28-33」は34と35の単一の値で続きます。

多分誰かが私をサポートするライブラリを知っていますその種の問題や良い解決策を知っていますか?

+0

offtopicです。何か試してみましたか? –

+0

まだありません。私は何かを試す前に、私は可能な解決策を探していて、他人からの経験について学びます。私はかなり残酷なソリューションを作成することはかなり可能だろうが、多分誰かが私の心の中でそのように少しエレガントな方法を提供することができる –

答えて

1

データ構造を変更し、接続された部分を再アセンブルしてソートすることで、連鎖アプローチを使用できます。ライブラリーを求めて

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

それはあなたの心に速く来ていた?今はちょっとばかげているIm。ありがとう、ニーナ。それはまさに私が必要とするものです。 –

+0

心配はありません。私は実際に最初にソートせずにアプローチを書いていますし、最後の削減部分は私の出発点でした。 –

関連する問題