2015-07-20 5 views
1

Я пытаюсь решить эту проблему: Напишите функцию, которая разбивает массив (первый аргумент) на группы по длине размера (второй аргумент) и возвращает их как многомерный массив , Например:Невозможно прочитать свойство «push» неопределенного многомерного массива

chunk(['a', 'b', 'c', 'd'], 2) 

должен вернуть

[['a'. 'b'], ['c', 'd']] 

Мой код выглядит следующим образом:

function chunk(arr, size) { 
    var newArr = [[]]; 
    for(i = 0; i < arr.length; i++) { 
    for(j = 0; j < size; j++) { 
     newArr[i].push(arr[i + j]); 
    } 
    } 
    return newArr; 
} 

Это дает ошибку: Не удается прочитать свойство 'толчок' в неопределенной. Почему это происходит и как я могу это исправить?

ответ

1

Вы можете сделать это с помощью вложенных циклов, но почему бы не пойти на более простой подход и использовать array.slice()?

function chunk(input, size) { 
    var output = []; 
    for(i = 0; i < input.length; i += size) { 
     output.push(input.slice(i, i + size)); 
    } 
    return output; 
} 
2

После

for(i = 0; i < arr.length; i++) { 

вы должны инициализировать один одномерный массив:

newArr[i] = []; 

Это позволит решить эту ошибку, но не дают желаемого результата. Я думаю, что нужно что-то вроде этого:

for (i = 0; i < ceil(arr.length/size); i++) { 
    newArr[i] = []; 
    for (j = 0; j < size; j++) { 
     if (i * size + j >= arr.length) 
      break; 
     newArr[i].push(arr[i * size + j]); 
    } 
} 
+0

может кто-нибудь объяснить, почему есть перерыв на линии 5? – Andrew

+0

Предположим, что 'size' = 3, но исходный' arr' состоит из 7 членов. Последний «кусок» будет содержать только 1 элемент - после этого не будет больше членов, чтобы заполнить оставшиеся 2 пятна в последнем фрагменте. Здесь происходит «перерыв». – Glorfindel

Смежные вопросы