You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中如何实现二维数组元素的上下移动(已完成左右移动)

二维数组中0元素的上下移动实现方案

核心逻辑

左右移动是操作同一行内的数组元素,而上下移动需要交换不同行的同列元素——比如0在第row行第col列,向上移动就是和第row-1行第col列的元素互换位置,向下则是和row+1行第col列互换。

完整代码实现

1. 查找0元素的位置

先写一个工具函数定位二维数组中0的坐标:

function findZeroPosition(arr) {
  for (let row = 0; row < arr.length; row++) {
    const col = arr[row].indexOf(0);
    if (col !== -1) {
      return { row, col };
    }
  }
  return null; // 数组中没有0时返回null
}

2. 上下移动实现

// 向上移动0元素
function moveUp(arr) {
  const zeroPos = findZeroPosition(arr);
  // 已经在第一行,无法上移,返回原数组的副本(避免修改原数据)
  if (!zeroPos || zeroPos.row === 0) {
    return arr.map(row => [...row]);
  }

  // 深拷贝原数组,避免直接修改原数据
  const newArr = arr.map(row => [...row]);
  // 交换当前行和上一行的同列元素
  [newArr[zeroPos.row][zeroPos.col], newArr[zeroPos.row - 1][zeroPos.col]] = 
  [newArr[zeroPos.row - 1][zeroPos.col], newArr[zeroPos.row][zeroPos.col]];
  
  return newArr;
}

// 向下移动0元素
function moveDown(arr) {
  const zeroPos = findZeroPosition(arr);
  // 已经在最后一行,无法下移,返回原数组的副本
  if (!zeroPos || zeroPos.row === arr.length - 1) {
    return arr.map(row => [...row]);
  }

  const newArr = arr.map(row => [...row]);
  // 交换当前行和下一行的同列元素
  [newArr[zeroPos.row][zeroPos.col], newArr[zeroPos.row + 1][zeroPos.col]] = 
  [newArr[zeroPos.row + 1][zeroPos.col], newArr[zeroPos.row][zeroPos.col]];
  
  return newArr;
}

3. 基于你已有函数的左右移动优化

可以把你写的changePosition整合到二维数组的左右移动逻辑中:

// 你已实现的一维数组元素位置调整函数
function changePosition(arr, from, to) {
  arr.splice(to, 0, arr.splice(from, 1)[0]);
  return arr;
}

// 向左移动0元素
function moveLeft(arr) {
  const zeroPos = findZeroPosition(arr);
  // 已经在最左列,无法左移
  if (!zeroPos || zeroPos.col === 0) {
    return arr.map(row => [...row]);
  }

  const newArr = arr.map(row => [...row]);
  // 对当前行调用你的changePosition函数
  changePosition(newArr[zeroPos.row], zeroPos.col, zeroPos.col - 1);
  return newArr;
}

// 向右移动0元素
function moveRight(arr) {
  const zeroPos = findZeroPosition(arr);
  const targetRowLength = arr[zeroPos.row].length;
  // 已经在最右列,无法右移
  if (!zeroPos || zeroPos.col === targetRowLength - 1) {
    return arr.map(row => [...row]);
  }

  const newArr = arr.map(row => [...row]);
  changePosition(newArr[zeroPos.row], zeroPos.col, zeroPos.col + 1);
  return newArr;
}

测试示例

用你提供的数组测试向上移动:

let arr = [
  [1, 1, 1, 1],
  [2, 2, 2, 2],
  [3, 3, 3, 0],
];

const movedUpArr = moveUp(arr);
console.log(movedUpArr);
// 输出结果:
// [
//   [1, 1, 1, 1],
//   [2, 2, 2, 0],
//   [3, 3, 3, 2],
// ]

注意点

  • 所有函数都返回原数组的深拷贝,避免直接修改输入的原数组,防止意外的副作用
  • 做了边界判断:0在第一行时无法上移,在最后一行时无法下移,在最左/最右列时无法左右移动

内容的提问来源于stack exchange,提问作者Dosya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 18:26:03