2016-09-13 6 views
-1

私はこのアルゴリズムで私の髪を引っ張っています。目的は、数値配列を入力として受け取り、すべての連続した数値を範囲として表示する文字列を出力することです。例えば、私の入力が[1,2,4,6,7,8]の場合、私の出力は "1-2,4,6-8"でなければなりません。私の問題は、ネストされたforループのif文での変数代入にあります。 IndexEnは、jが増分するたびにオーバーライドされ、最終的に内側ループを最高値として終了する必要があります。問題は、forループの外で変数を呼び出そうとすると、最大値ではなくIndexEnの各値が渡されることです。私はIndexEnがインナーループのスコープの外側にあり、インナーループがまだ実行されている間にどのようにできるか分かりません。誰かが私がここで起こっていることを修正し理解するのを助けてくれますか?入れ子にされたforループのJavascript変数の割り当て

function bkInd(arr){ 
 
    var bookSt=""; 
 
    var indexSt; 
 
    var indexEn; 
 
    for(var i =0;i<arr.length-1;i++){  
 
     if(arr[i+1] !== (arr[i]+1)) { 
 
      if(i===0 || (i>0 && arr[i]) !== (arr[i-1]+1)){ 
 
       bookSt+= arr[i]+","; 
 
      } 
 
     // check to see if number are sequential and SHOULD output starting index value - last value  
 
     }else{ 
 
      for(var j=i+1;j<arr.length;j++){ 
 
        var count=0;  
 
       if(arr[j]==(arr[i +count]+1)){ 
 
        indexSt = arr[i]; 
 
        indexEn = arr[j]; 
 
        count+=1; 
 
       } 
 
      } 
 
      //concatenate string 
 
      //console.log(indexEn); for value of index 
 
      bookSt+= indexSt+"-"+indexEn+","; 
 
     }  
 
    } 
 
    return bookSt; 
 
} 
 
var bookList = [1,3,4,5,7,9,10,11]; 
 
document.write(bkInd(bookList));

答えて

0

コードは、あなたの条件に応じて更新されます。

function bkInd(arr){ 
 
    var bookSt=""; 
 
    var indexSt; 
 
    var indexEn; 
 
    for(var i =0;i<arr.length-1;i++){  
 
     if(arr[i+1] !== (arr[i]+1)) { 
 
      if(i===0 || (i>0 && arr[i]) !== (arr[i-1]+1)){ 
 
       bookSt+= arr[i]+","; 
 
      } 
 
     // check to see if number are sequential and SHOULD output starting index value - last value  
 
     }else{ 
 
     \t var count=1; 
 
     \t indexSt = arr[i]; 
 
      for(var j=i;j<arr.length;j++){ 
 
       
 
       if(arr[j]==(indexSt+count)){ 
 
        indexEn = arr[j]; 
 
        count+=1; 
 
        i++; 
 
       } 
 
      } 
 
      //concatenate string 
 
      //console.log(indexEn); for value of index 
 
      bookSt+= indexSt+"-"+indexEn+","; 
 
     }  
 
    } 
 
    return bookSt; 
 
} 
 
var bookList = [1,3,4,5,7,9,10,11]; 
 
console.log(bkInd(bookList));

ループロジックのためのあなたの内側が正しくありませんでした。私は要件を満たすためにコードを更新しました。

私はループネストされた(大きなデータセットに遅くなることがあります)ので、私は別のアプローチを取った、あなたは気にしない願って好きではない
1

var bkInd = function(arr) { 
    var result = []; 
    var seq = []; // 'Temporary' array 

    for(var i = 0; i < arr.length; i++) { 
     seq.push(arr[i]) 
     if(arr[i] + 1 !== arr[i + 1]) { 
      result.push(seq.length > 1 ? seq[0] + '-' + seq.pop() : arr[i]); 
      seq = []; 
     } 
    } 
    return result.join(', ') 
} 
    // => '1, 3-5, 7, 9-11' 

それは代わりの一時的な配列を「構築」を数字(seq)は、arrをループします。次の番号がシーケンシャルの場合は、seqが最後の番号を保持してループが続行されます。次の数字が現在の数字より1つ上の数字より大きい場合、seqresultにプッシュされますが、seqが複数のインデックスの長さになると、ハイフネーションされた文字列に連結されます。 seqがプッシュされると、空の配列にリセットされます。最後に、result配列をコンマで結合します。

0

スコープは、変数が直接アクセスできるコードの領域です。 JSスコープ内

function Sによって定義され、letconstおよびcatchブロックによるブロック(すなわち{})。

次が動作しているようです:

function runnify(arr) { 
 
    var runFrom; 
 
    return arr.reduce((p,c,i)=>{ 
 
     if (c + 1 === arr[++i]) { // true if next item is sequential    
 
      if (runFrom == null) { // We are at start of run     
 
       runFrom = c; 
 
      } 
 
      return p; 
 
     } 
 
     
 
     if (runFrom) { // We are at the end of a run    
 
      p.push(`${runFrom}-${c}`); 
 
      runFrom = null; 
 
      return p; 
 
     } 
 
     
 
     p.push(c); // Not sequential 
 
     return p;   
 
    }, []).join(','); 
 
} 
 
var seq = [1, 3, 4, 5, 7, 9, 10, 11]; 
 
document.write(runnify(seq));

0

基本的に、あなたが連続した場合は、配列に、チェックしてすべてのアイテムを収集し、最後にそれに参加する、との連続した要素のための可能性ダッシュと残りはカンマで区切ります。

function consecutive(array) { 
 
    return array.reduce(function (r, a,i) { 
 
     var last = r[r.length - 1]; 
 
     if (!i || last[last.length - 1] + 1 !== a) { 
 
      r.push([a]); 
 
     } else { 
 
      last[1] = a; 
 
     } 
 
     return r; 
 
    }, []).map(function (a) { return a.join('-'); }).join(); 
 
} 
 

 
var array = [1, 3, 4, 5, 7, 9, 10, 11], 
 
    grouped = consecutive(array); 
 

 
console.log(grouped);

関連する問題