2017-06-27 9 views
0

"Chunky Monkey"というfreeCodeCampチャレンジを実行しています。目的は、1D arraysizeの数値の2つのパラメータを取る関数を作成することです。JavaScript:1D配列を指定されたサイズで2D配列に変換します。

配列は、長さがsize(複数の場合)のグループに分割され、2D配列が作成されます。私の最初の試みで

、私のコードされた:

function chunkArrayInGroups(arr, size) { 
 
    var set = arr.length/size; 
 
    var count = 0; 
 
    set = Math.ceil(set); //ensure that an integer is obtained 
 
    var array = []; 
 
    for (var i = 0; i < set; i++) { 
 
    array[i] = []; //ensure each element i is an array 
 
    for (var j = 0; j < size; j++) { 
 
     array[i][j] = arr[count]; //obtain values from passed array, arr 
 
     count++; 
 
    } 
 
    } 
 
    return array; 
 
} 
 

 
var result = chunkArrayInGroups(["a", "b", "c", "d"], 2); 
 
console.log(result);

私はこのコードを数回トレースしているが、それは間違っているなぜ私が言うことができません。誰かがそのエラーを見つけてください。

私はやや異なる方法で問題を解決しましたが、うまくいきましたが、なぜ上記のコードがうまくいかなかったのかに非常に興味があります。

+2

ねえけど、それが働いている –

+1

コードが –

+0

働いている私はここでの問題は、それが常に指定された長さを持つ配列を作成していると思います。したがって、あなたが '' [["a"、 "b"、 "c"]、["d"、d "]、 "、" undefined、undefined]] ' –

答えて

1

あなたは一度最大限界に達するカウントループを切断する必要があります。

function chunkArrayInGroups(arr, size) { 
 
    var set = arr.length/size; 
 
    var count = 0; 
 
    set = Math.ceil(set); //ensure that an integer is obtained 
 
    var array = []; 
 
    out: 
 
    for(var i = 0; i<set; i++){ 
 
    array[i] = []; //ensure each element i is an array 
 
    for (var j=0; j<size; j++){ 
 
     if (count === arr.length) { 
 
     break out; 
 
     } 
 
     array[i][j] = arr[count]; //obtain values from passed array, arr 
 
     count++; 
 
    } 
 
    }  
 
    return array; 
 
} 
 

 
var result = chunkArrayInGroups([0, 1, 2, 3, 4, 5, 6, 7, 8], 4); 
 

 
console.log(result);

1

コードが機能している(一部の例外を除いて、console.log(chunkArrayInGroups(["a", "b", "c", "d"], 5));と@shaochuancs答えるの結果を参照)が、 (チャンクの機能を参照してください)のようなネイティブメソッドを使用するより簡単なアプローチを試みることができます:

function chunkArrayInGroups(arr, size) { 
 
    var set = arr.length/size; 
 
    var count = 0; 
 
    set = Math.ceil(set); //ensure that an integer is obtained 
 
    var array = []; 
 
    for(var i = 0; i<set; i++){ 
 
    array[i] = []; //ensure each element i is an array 
 
    for (var j=0; j<size; j++){ 
 
     array[i][j] = arr[count]; //obtain values from passed array, arr 
 
     count++; 
 
    } 
 
    }  
 
    return array; 
 
} 
 

 
function chunk(arr, size) { 
 
    var chunkedArray = []; 
 
    while (arr.length > 0) { 
 
    chunkedArray.push(arr.splice(0, size)); 
 
    } 
 
    return chunkedArray; 
 
} 
 

 
console.log(chunkArrayInGroups(["a", "b", "c", "d"], 2)); 
 
console.log(chunkArrayInGroups(["a", "b", "c", "d"], 5)); 
 
console.log(chunkArrayInGroups([], 2)); 
 

 
console.log(chunk(["a", "b", "c", "d"], 2)); 
 
console.log(chunk(["a", "b", "c", "d"], 5)); 
 
console.log(chunk([], 2));

+0

これはとても涼しいです。ありがとうございました。 – Matt

関連する問題