Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   перебор массива с отступом (https://javascript.ru/forum/misc/59093-perebor-massiva-s-otstupom.html)

nerv_ 28.10.2015 00:03

вариант...
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));

рони 28.10.2015 00:32

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]]]

laimas 28.10.2015 09:33

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().

рони 28.10.2015 10:14

матрица разбить на квадраты
 
: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))

nerv_ 28.10.2015 13:53

Цитата:

Сообщение от рони
а что нужно поставить в аргументы split чтоб получить из

придется добавить немного магии :)
как видишь, я руками в строке 03 добавляю фиксированный размер массива (2х2)

на самом деле постановка задачи никакая)
не понятно зачем вообще такие извращения

рони 28.10.2015 14:09

:-? ... мда ... видимо сделать универсальный вариант, более никому не интересно :)
laimas, шаблон в цикле
nerv_, шаблон но цикл заменён на рекурсию

laimas 28.10.2015 14:50

Цитата:

Сообщение от рони
laimas, шаблон в цикле

?

А в чем собственно проблема? Я понимаю так - задана размерность среза, которую нужно получить из массива. Получать данные нужно по смещению этой размерности среза, при чем элементы среза нужно получать не по строкам, а по колонкам массива.

Итого - итерация внешнего цикла это постоянное смещение на размерность среза по строкам массива, а итерация внутреннего цикла, это постоянное смещение на размерность среза по колонкам массива. Во внутреннем цикле получаем срез, смещение которого определяется размерностью среза для колонок и строк массива.

Лично меня жаба бы задавила гонять четыре цикла с долгими переборами и проверками. :)

Я занимаюсь разработкой шрифта, вот закончу, тогда... А все таки беден JS на готовые функции для работы с массивами.

Brook 28.10.2015 16:57

спасибо

Brook 28.10.2015 19:17

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);

laimas 28.10.2015 20:20

Цитата:

Сообщение от Brook
что я тупанул и сразу не сделал рекурсию

А она тут нужна?


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