2016-12-21 1 views
1

配列があります。可能であれば、すべての値を印刷したいのですが、間隔を入れて印刷したいと思います。例:配列からすべての値を出力しますが、間隔がある場合は書式設定してください。

[1,2,3,5,7,8,10] 

私はあなたが欲しいものを理解していると思います。

"1-3、5、7-8、10"

だから、私たちは、その後、配列に1,2,3を持っている:上記の配列のために私は次の文字列を取得したいです5. 4は存在しないので、最初の間隔を閉じて文字列1-3に追加します。この場合、間隔を作成することはできません。したがって、間隔を作成することはできません。したがって、5を追加します。次に7を、7を8に、8を10に移動してから、 。最後は10ですので、文字列に追加するだけです。結果として、

「1-3,5,7-8,10」となります。

私は次のようにこのタスクを解決:

let numbers = [1,2,3,4,7,9,12,13]; 

numbers.sort((a,b) => {return a - b}); 
let str=''; 
let startIndex =0, start, end; 
if(numbers.length === 1) { 
    str = `${numbers[0]}`; 
} 

for(let i=0; i< numbers.length; i++) { 
    if(i === 0) { 
    continue; 
    } 

    if(numbers[i-1] +1 !== numbers[i]) { 
    start = numbers[startIndex]; 
    end = numbers[i -1]; 
    if(start - end === 0) { 
     str += `${start},`; 
    } 
    else { 
     str += `${start} - ${end},`; 
    } 

    startIndex = i; 

    } 

    if(i+1 === numbers.length) { 
    start = numbers[startIndex]; 
    end = numbers[i]; 
    if(start - end === 0) { 
     str += `${numbers[i]}`; 
    } else { 
      str += `${numbers[startIndex]} - ${numbers[i]}`; 
    } 
    } 

} 

console.log(str); 

しかし、コードが理解するために非常に複雑に見えます。これを行うより良い方法はありますか?

DEMO

+0

達成したいことは明確ではありません。期待される結果についてもっと詳しく説明してください。 – sAcH

+6

[CodeReview](http://codereview.stackexchange.com/)でこれを尋ねる必要があります。 – Xufox

+0

@Xufox。これはコードレビューだけではありません、私が言ったように、より良い方法が存在するかもしれない、例えばアルゴリズムです。 – user348173

答えて

2

あなたは自分の前任者でアイテムをテストし、右のグループに移動することができます。

var data = [1, 2, 3, 5, 7, 8, 10], 
 
    result = data.reduce(function (r, a, i, aa) { 
 
     if (aa[i - 1] === a - 1) { 
 
      r[r.length - 1][1] = a; 
 
     } else { 
 
      r.push([a]); 
 
     } 
 
     return r; 
 
    }, []).map(a => a.join('-')).join(', '); 
 

 
console.log(result);

+0

優秀な解決策、ありがとう、ニーナ。 – user348173

2

ここペアの配列に(ソート)配列(範囲)に変換する機能です。

let rangify = function(xs) { 
 
    let ranges = []; 
 
    
 
    for (let x of xs) { 
 
     let last = ranges[ranges.length - 1]; 
 
    
 
     if (!last || x > last[1] + 1) 
 
      ranges.push([x, x]) 
 
     else 
 
      last[1]++; 
 
    } 
 
    
 
    return ranges; 
 
}; 
 

 

 
let r = rangify([1,2,3,5,7,8,10,11,12,13,77,78]); 
 
console.log(r)

それからあなたの所望の出力を取得する方法を明らかにする必要があります。

関連する問題