首页 > 网页制作 >使用Array.prototype.fill快速初始化带默认占位符的网格数据结构

使用Array.prototype.fill快速初始化带默认占位符的网格数据结构

来源:互联网 2026-07-31 20:52:06

聊到JavaScript数组的批量初始化,Array.prototype.fill确实是一个便捷的工具。不过需要明确:它本身不能直接创建二维数组,真正的优势在于,在已搭好框架的嵌套数组中高效填充默认值。配合Array.from或Array(n).fill().map()这套组合用法,初始化一个带占位

聊到JavaScript数组的批量初始化,Array.prototype.fill确实是一个便捷的工具。不过需要明确:它本身不能直接创建二维数组,真正的优势在于,在已搭好框架的嵌套数组中高效填充默认值。配合Array.fromArray(n).fill().map()这套组合用法,初始化一个带占位符的网格结构会变得非常顺畅。

使用Array.prototype.fill快速初始化带默认占位符的网格数据结构

先搭架子,再填内容

这里有一个常见的陷阱:很多新手尝试直接对二维数组调用fill,结果发现所有行都指向同一个数组——也就是所谓的浅拷贝问题。正确的做法是,先通过Array.from生成彼此独立的多行,再对每行单独填充或赋值。

长期稳定更新的攒劲资源: >>>点此立即查看<<<

  • 要生成一个3行4列的网格,每个格子初始为null,可以这样写:
    const grid = Array.from({ length: 3 }, () => Array(4).fill(null));
  • 如果想用fill替换某一行的全部值,比如把第1行全设为'X'
    grid[1].fill('X');
  • 如果需要整张网格统一填某个值,比如全部置0,务必用Array.from来生成独立行:
    const grid = Array.from({ length: 3 }, () => Array(4).fill(0)); 
    • 反例:Array(3).fill(Array(4).fill(0)) 这就掉入陷阱了。

动态占位符,fill也能搭把手

当占位符需要按位置动态生成时,比如想要类似'r0c0'这种带行列索引的字符串,map方法可以和fill配合得很好,或者直接通过构造来实现。

  • 生成一个带行列索引的小网格:
    const grid = Array.from({ length: 2 }, (_, i) =>
      Array.from({ length: 3 }, (_, j) => `r${i}c${j}`)
    );
    // → [['r0c0','r0c1','r0c2'], ['r1c0','r1c1','r1c2']]
  • 如果先建好空网格,再按需填充某些区域,比如把第一列全设为'header',通常用forEach更精准:
    grid.forEach(row => row[0] = 'header');
    也可以用fill批量填充多列:
    grid.forEach(row => row.fill('default', 1, 3)); // 填充第1到第2列

边界与不可变性,值得留意

fill(value, start, end)这个方法的end参数是**不包含**的,索引从0开始,而且它直接修改原数组,不返回新数组。这对局部初始化来说相当实用:

  • 只填充第0行的前两个单元格:
    grid[0].fill('★', 0, 2);
  • 清空中间一列(比如第1列)的所有值:
    grid.forEach(row => row.fill(undefined, 1, 2));
  • fill不会触发setter,也不影响数组长度,适合轻量的重置操作。

什么时候该换别的路子

话说回来,fill也不是万能的。如果你的网格结构比较复杂,比如每行长度不同、需要深度克隆,或者占位符值依赖异步数据,那么fill就不太够用了。此时优先考虑Array.from加回调,或者写一个专门的初始化函数:

  • 不规则网格(每行列数不同):
    const jagged = [[1], [2,3], [4,5,6]].map(row => row.fill(0));
  • 需要深拷贝默认对象时,需要借助map来构造新对象,避免引用共享:
    const grid = Array.from({ length: 2 }, () =>
      Array.from({ length: 2 }, () => ({ id: Date.now(), active: false }))
    );
    这种情况下就不推荐使用fill了。

侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述

热游推荐

更多
湘ICP备14008430号-1 湘公网安备 43070302000280号
All Rights Reserved
本站为非盈利网站,不接受任何广告。本站所有软件,都由网友
上传,如有侵犯你的版权,请发邮件给xiayx666@163.com
抵制不良色情、反动、暴力游戏。注意自我保护,谨防受骗上当。
适度游戏益脑,沉迷游戏伤身。合理安排时间,享受健康生活。