Я пытаюсь создать функцию javascript, которая сдвигает массив справа x единиц на все юниты. Он должен поддерживать размер массива одинаковым, и он должен вызывать unloadChunk для элементов, которые сбрасываются с многомерного массива. Вот моя текущая реализация:Каков наилучший способ переноса многомерного массива в Javascript?
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];
}
}
}
}
}
Если у вас возникли проблемы с пониманием, что именно я хочу, функция сдвига делать, посмотрите на this fiddle и посмотрите на вывод HTML. Моя попытка создания функции сдвига работает, но для петель 10. Мой вопрос был, есть ли более эффективный, менее верный способ сделать это?
Вам нравится поддерживать одинаковые размеры массивов? или просто добавить, двигаясь вправо, «нуль» впереди? –
@NinaScholz Сохранение одинакового размера массивов важно, потому что в моем случае я заполняю все нулевые значения новыми значениями. Извините, что не упоминал об этом в сообщении, теперь я отредактирую это. – epitaque