Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Преобразовать вектор в матрицу (https://javascript.ru/forum/misc/48656-preobrazovat-vektor-v-matricu.html)

ponyspy 11.07.2014 14:27

Преобразовать вектор в матрицу
 
Всем привет, я столкнулся с задачей и не понимаю как ее решить...

Есть массив
var arr = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'];

Необходимо привести его вот к такому виду:
var arr_res = [
  ['01', '05', '09'],
  ['02', '06', '10'],
  ['03', '07', '11'],
  ['04', '08', '12']
];


Мой вариант использует объект, вместо двухмерного массива и к тому же не работает...

var arr = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'];

var matrix = {
	one: [],
	two: [],
	three: [],
	four: []
}

for (var i = 0; i <= arr.length; i++) {
	switch (i) {
        case (i + 0): matrix.one.push(arr[i]); break;
        case (i + 1): matrix.two.push(arr[i]); break;
        case (i + 2): matrix.three.push(arr[i]); break;
        case (i + 3): matrix.four.push(arr[i]); break;
	}
}


В идеале алгоритм должен принимать параметр количества строк в матрице.

Спасибо!

nerv_ 11.07.2014 15:13

function group(array, chunk) {
    var stack = [];
    for(var i = 0, len = array.length; i < len; i += chunk) {
        stack.push(array.slice(i, i + chunk));
    }
    return stack;
}

alert(JSON.stringify(group([1,2,3,4,5,6,7], 3)));

Tek 11.07.2014 15:21

Вариант по n - http://jsfiddle.net/HJ52r/4/

nerv_ 11.07.2014 15:39

Цитата:

Сообщение от Tek
Вариант по n

у меня тоже по n :)

ponyspy 11.07.2014 17:51

Tek,
Огромное спасибо!

Вариант nerv_,
неправильно собирает матрицу

nerv_ 12.07.2014 00:27

Цитата:

Сообщение от ponyspy
Вариант nerv_,
неправильно собирает матрицу

Это потому, что он называется group :lol: Что-то меня клинит на этой неделе))) Надеюсь, только на этой :D

До кучи еще один вариант:
var arr = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'];
console.log(toMatrix2(arr, 4));

// ---------------------

function toMatrix2(array, rowsCount) {
    var step = Math.floor(array.length / rowsCount) + 1;
    var len = array.length;
    var martrix = [];
    
    for(var i = 0; i < rowsCount; i++) {
        martrix.push([]);
        for(var j = i; j < len; j+= step) {
            martrix[i].push(arr[j]);
        }
    }
    
    return martrix;
}

ponyspy 14.07.2014 13:16

nerv_,
И снова неудача:)

Попробуйте указать в вашем варианте rowsCount = 5

nerv_ 14.07.2014 14:38

Цитата:

Сообщение от ponyspy
И снова неудача

Обоснуй.

Указал 5. Вариант
toMatrix разбил на 6 строк вместо 5
toMatrix2 разбил на 5 строк

Или ты знаешь способ разделить 12 на 5 без остатка? :D

рони 14.07.2014 15:21

ponyspy,
:write:
var arr = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'];

function foo(arr, row) {
     var a = [];
     for (var i = 0; i < row;) {
         a[i] ? a[i].push(arr.shift()) : (a[i] = []);
         i = ++i % row ; 
         if (!arr.length) return a;
     }
 }
 alert(JSON.stringify(foo(arr, 4)))


Часовой пояс GMT +3, время: 03:32.