javascript - 在 Javascript 中移动多维数组的最佳方法是什么?

标签 javascript arrays multidimensional-array

我正在尝试创建一个 JavaScript 函数,将数组向右移动 x 单位,向上移动 y 单位。它必须保持数组大小相同,并且必须为从多维数组移出的元素调用 unloadChunk。这是我当前的实现:

function shift(x, y) {
    if (x > 0) {
        for (var i = 0; i < chunks.length; i++) {
            for (var j = chunks[i].length - 1; j >= 0; j--) {
                if(j + x > chunks[i].length - 1 && chunks[i][j]) {
                  unloadChunk(i, j);
                } 
                if (j < x) {
                    chunks[i][j] = null;
                }
                else {
                    chunks[i][j] = chunks[i][j - x];
                }
            }
        }
    }
    else if (x < 0) {
        for (var i = 0; i < chunks.length; i++) {
            for (var j = 0; j < chunks[i].length; j++) {
                if(j + x  < 0 && chunks[i][j]) {
                  unloadChunk(i, j);
                } 
                if (j - x >= chunks[i].length) {
                    chunks[i][j] = null;
                }
                else {
                    chunks[i][j] = chunks[i][j - x];
                }
            }
        }
    }
    if (y > 0) {
        for (var i = 0; i < chunks.length; i++) {
            if (i + y >= chunks.length) {
                for (var j = 0; j < chunks.length; j++) {
                  if(i - y < 0 && chunks[i][j]) {
                    unloadChunk(i, j);
                  }
                  chunks[i][j] = null;
                }
            }
            else {
                for (var j = 0; j < chunks.length; j++) {
                    if(i - y < 0 && chunks[i][j]) {
                      unloadChunk(i, j);
                    }
                    chunks[i][j] = chunks[i + y][j];
                }
            }
        }
    }
    else if (y < 0) {
        for (var i = chunks.length - 1; i >= 0; i--) {
            if (i + y < 0) {
                for (var j = 0; j < chunks.length; j++) {
                     if(i - y > chunks.length - 1 && chunks[i][j]) {
                       unloadChunk(i, j);
                     }
                    chunks[i][j] = null;
                }
            }
            else {
                for (var j = 0; j < chunks.length; j++) {
                     if(i - y > chunks.length - 1 && chunks[i][j]) {
                       unloadChunk(i, j);
                     }
                    chunks[i][j] = chunks[i + y][j];
                }
            }
        }
    }
}

如果您无法准确理解我想要 Shift 函数执行的操作,请查看 this fiddle并查看 html 输出。 我尝试创建 shift 函数,但它有 10 个 for 循环。我的问题是,是否有更有效、更简洁的方法来做到这一点?

最佳答案

此提案使用

为了获得更好的可见性,我将 null 值替换为 100020003000 4000

function shift(x, y) {
    while (x > 0) {
        chunks.forEach(function (a) {
            a.pop();
            a.unshift(1000);
        });
        x--;
    }
    while (x < 0) {
        chunks.forEach(function (a) {
            a.shift();
            a.push(2000);
        });
        x++;
    }
    while (y > 0) {
        chunks.unshift(chunks.pop().map(function () { return 3000; }));
        y--;
    }
    while (y < 0) {
        chunks.push(chunks.shift().map(function () { return 4000; }));
        y++;
    }
}

function print(msg) {
    document.body.innerHTML += '<p>' + msg + '</p>';
}

function printarr(arr) {
    for (var i = 0; i < arr.length; i++) {
        print(JSON.stringify(arr[i]))
    }
}

var chunks = [[5, 3, 1], [9, 2, 5], [2, 3, 7]];

print("chunks: " + JSON.stringify(chunks));
shift(1, 0);
print("shifting right 1. chunks: "); printarr(chunks);
shift(-1, 0);
print("shifting left 1. chunks: "); printarr(chunks);
shift(0, 1);
print("shifting up 1. chunks: "); printarr(chunks);
shift(0, -1);
print("shifting down 1. chunks: "); printarr(chunks);

关于javascript - 在 Javascript 中移动多维数组的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38403950/

相关文章:

java - 二维数组中的坐标邻近度

javascript - 如何监视 JavaScript 中的递归函数

javascript - 通过for循环从列表中的每个图像文件获取源属性

javascript - JS 数学方法问题 : function is removing multiple min/max values (I think? )

java - Array 与 ArrayList 的性能

c++ - Eigen 和巨大的密集二维阵列

Javascript |最小和最大方法到一种 DRY 方法

javascript - 如何在python中使用真正的jquery从网页中提取数据?

c - 如何将结构体指针赋值为null?

C++ 异构字典