2017-10-31 16 views
-2

データ配列を持っています。 var arr = [1,2,3,4,5,7,8,10,11,12,15]。 データ番号配列の配列が2桁以上の範囲に一致する場合。上記のデータ配列を以下のように表示したい。 result = [1-5,7,8,10-12,15]データのJavaScript配列を範囲にソート

上記のJavaScriptの結果をどのように達成することができますか?

+0

あなたは何を試してみましたか?手動でこの問題をどのように解決しますか? – Jimmy

+0

これで、配列の整数値から文字列値に移動しますか? – Moose

+0

数字の配列は内部に '-'を持つことはできません – komron

答えて

1

あなたは数が変更に、範囲内の最後の文字列をあるかどうかを確認または結果セットに値をプッシュすることができません。

1, 2, 3, 4, 5, 7, 8, 10, 11, 12, 15 
^         no predecessor, push value 
+^+        predecessor and successor, change last value 
     + +^      predecessor and previous predecessor, change last 

var array = [1, 2, 3, 4, 5, 7, 8, 10, 11, 12, 15], 
 
    result = []; 
 

 
array.forEach(function (a, i, aa) { 
 
    result.push(aa[i - 1] + 1 === a && (aa[i - 2] + 1 === aa[i - 1] || a + 1 === aa[i + 1]) 
 
     ? [result.pop().split('-')[0], a].join('-') 
 
     : a.toString()); 
 
}); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

解決策を教えていただきありがとうございます。問題から選別するのに役立ちました – vadlamani

0

一つの方法は、それが

function getRanges(array) { 
 
    let ranges = [], rstart, rend; 
 
    for (let i = 0; i < array.length; i++) { 
 
    rstart = array[i]; 
 
    rend = rstart; 
 
    while (array[i + 1] - array[i] == 1) { 
 
     rend = array[i + 1]; 
 
     i++; 
 
    } 
 
    ranges.push(rstart == rend ? rstart+'' : rstart + '-' + rend); 
 
    } 
 
    return ranges; 
 
} 
 

 
const range1 = getRanges([1,2,3,4,5,7,8,10,11,12,15]); 
 
console.log(range1); 
 
const range2 = getRanges([1,2,3,5,7,9,10,11,12,14 ]); 
 
console.log(range2); 
 
const range3 = getRanges([1,2,3,4,5,6,7,8,9,10]) 
 
console.log(range3);

+0

、7と8は一緒に使用しないでください。 –