вариант...
function split(src, dist, step, row, column) { if (row + step < src.length) { dist.push([ [src[row][column], src[row][column + step]], [src[row + step][column], src[row + step][column + step]], ]); if (column + step + 1 < src[0].length) { return split(src, dist, step, row, column + step + 1); } else { return split(src, dist, step, row + step + 1, 0); } } return dist; } var arr = [ [1,2,3,4], [5,6,7,8], [9,10,11,12], [13,14,15,16] ]; console.log(split(arr, [], 1, 0, 0)); console.log(split(arr, [], 3, 0, 0)); |
nerv_,
а что нужно поставить в аргументы split чтоб получить из var arr = [ [1,2,3,4,5,6,7,8,9], [10,11,12,13,14,15,16,17,18], [19,20,21,22,23,24,25,26,27], [28,29,30,31,32,33,34,35,36], [37,38,39,40,41,42,43,44,45], [46,47,48,49,50,51,52,53,54], [55,56,57,58,59,60,61,62,63], [64,65,66,67,68,69,70,71,72 ], [73,74,75,76,77,78,79,80,81] ]; результат var arr=[[[1, 2, 3], [10, 11, 12], [19, 20, 21]], [[4, 5, 6], [13, 14, 15], [22, 23, 24]], [[7, 8, 9], [16, 17, 18], [25, 26, 27]], [[28, 29, 30], [37, 38, 39], [46, 47, 48]], [[31, 32, 33], [40, 41, 42], [49, 50, 51]], [[34, 35, 36], [43, 44, 45], [52, 53, 54]], [[55, 56, 57], [64, 65, 66], [73, 74, 75]], [[58, 59, 60], [67, 68, 69], [76, 77, 78]], [[61, 62, 63], [70, 71, 72], [79, 80, 81]]] |
var a = [ ['01', '02', '03', '04'], ['05', '06', '07', '08'], ['09', '10', '11', '12'], ['13', '14', '15', '16'] ], b = [], i, s = 2; for(i = 0; i<a.length; i += s) { b.push([a[i].slice(0, s), a[i+1].slice(0, s)], [a[i].slice(s), a[i+1].slice(s)]) } console.log(b) Маленько подумать, и для любой n-размерности в итерации нужно пройтись циклом n-раз в котором уже и push(). |
матрица разбить на квадраты
:write: :)
оставлю тут вариант на данный момент function matrix(c, d) { for (var h = [], a = 0; a < d * d; a += d * (c - 1)) for (var f = 0; f < d; f += c) { for (var g = [], e = [], b = 0; b < c; b++) e.push(a + b + 1); g.push(e); for (b = 0; b < c - 1; b++) e = e.map(function(a) { return a + d }), g.push(e); h.push(g); a += c } return h }; alert(JSON.stringify(matrix(2,4))) alert(JSON.stringify(matrix(3,9))) console.log(matrix(3,9)) |
Цитата:
как видишь, я руками в строке 03 добавляю фиксированный размер массива (2х2) на самом деле постановка задачи никакая) не понятно зачем вообще такие извращения |
:-? ... мда ... видимо сделать универсальный вариант, более никому не интересно :)
laimas, шаблон в цикле nerv_, шаблон но цикл заменён на рекурсию ![]() |
Цитата:
А в чем собственно проблема? Я понимаю так - задана размерность среза, которую нужно получить из массива. Получать данные нужно по смещению этой размерности среза, при чем элементы среза нужно получать не по строкам, а по колонкам массива. Итого - итерация внешнего цикла это постоянное смещение на размерность среза по строкам массива, а итерация внутреннего цикла, это постоянное смещение на размерность среза по колонкам массива. Во внутреннем цикле получаем срез, смещение которого определяется размерностью среза для колонок и строк массива. Лично меня жаба бы задавила гонять четыре цикла с долгими переборами и проверками. :) Я занимаюсь разработкой шрифта, вот закончу, тогда... А все таки беден JS на готовые функции для работы с массивами. |
спасибо
|
nerv_,
чутка сменил под свои нужды = спасибо, и что я тупанул и сразу не сделал рекурсию ?! - лох )) function split(src, st, r, c) { if(!st) return false; if (r + st < src.length && c + st < src[0].length) { console.log(st +"---------"+src[r][c]+","+ src[r][c + st]+","+src[r + st][c]+","+ src[r + st][c + st]); if (c + st +1 < src[0].length) { return split(src, st, r, ++c + st); } else { return split(src, st, ++r + st, 0); } } else split(src, st==1?0:Math.ceil(st/2), 0, 0); } var arr = [ [1,2,3,4], [5,6,7,8], [9,10,11,12], [13,14,15,16] ]; split(arr, 3, 0, 0); |
Цитата:
|
Часовой пояс GMT +3, время: 01:52. |