2015-05-13 6 views
1

ЦЕЛИExtract «N» значение из массива

«Коренастый Monkey» Проблема: Создать новый многомерный массив из заданного массива («обра») и номера («размера»). Новый многомерный массив должен создавать длины массивов, равные переменной 'size'.

Пример # 1

chunk(['a', 'b', 'c', 'd'], 2); 
var answer = []; 
function chunk(arr,size){ 
//do something 
}; 

return answer 

ожидаемый ответ # 1

answer = [['a','b'],['c','d']]; 

Пример # 2

Ниже приводится examp le при наличии нечетного числа элементов/размеров. В такой ситуации ожидаемый результат состоит в том, чтобы иметь группу «остаток».

chunk(['a', 'b', 'c', 'd'], 3); 
    var answer = []; 
    function chunk(arr,size){ 
    //do something 
    }; 

    return answer 

ожидаемый ответ # 2

answer = [['a','b','c'],['d']]; 


MY псевдокод/​​ПОДХОД

var final = []; 
function chunk(arr, size) { 
    //extract number of elements from 'arr' = 'size' 
    var extract = function{ 
    //HELP! [INSERT LOGIC] 
    }; 

    //add extracted elements to 'group' array 
    var group = [extract]; 

    //push 'group' to 'final' array for multidimensional array 
    final.push(group); 

    //return final' 
    return final; 
} 

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

ВОПРОСЫ

  1. Я смотрел @ .forEach(), для (в) петли, .slice() и т.д., но безрезультатно. Все мои подходы приведут к циклическому перемещению по массиву, но не к их «спариванию».
  2. Я слишком усложняю вещи? Есть ли более прямой подход, чем мой псевдокод/​​подход?
+2

что-то вроде 'в то время как (х = arr.splice (-2,2) .length) array2.push (x); ' – dandavis

+0

Сколько раз вы хотите группировать элементы в группах по два? Это всегда длина массива, кратная размеру? – vasilenicusor

+0

@ dandavis Правильно ли в этом анализе: вы используете splice() для циклического перехода по индексу и удаления последних записанных значений? – jonplaca

ответ

2

Вы можете использовать рекурсивную функцию:

function chunk(arr, size) { 
    if(!arr.length) return []; 
    return [arr.slice(0, size)].concat(chunk(arr.slice(size), size)); 
} 

Или цикл:

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

Спасибо за отличный ответ. – jonplaca

1

Вы можете использовать slice, чтобы получить куски.

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

См demo

0

Это мое решение. Если массив ввод не кратно size, последняя группа из результата будет содержать Остальные пункты

function chunk(arr, size) { 
    var arr_size = arr.length, 
     no_groups = arr_size/size, 
     i, 
     final = []; 
    if (no_groups == 0){ 
     return arr; 
    } 
    for(i=0;i<no_groups;i++){ 
     final.push(arr.splice(0, size)); 
    } 
    return final; 
} 

JSFiddle demo