Array.fill 和 for 循环创建数组有什么区别[重复]

2023-12-14

我正在使用 React.js 创建一个地下城爬行游戏,并使用 Array.fill(0) 初始化棋盘。但是当我在二维数组中设置一个元素时,它将整个数组(列)设置为'player'而不是单一元素。我还有一个createBoard()功能,注释掉,工作正常。那么为什么会发生这种情况以及如何正确使用 Array.fill 呢?

这是我的董事会组件:

import React, {Component} from 'react';
import Cell from './Cell';

class Board extends Component {
  constructor(props) {
    super(props);
    const dim = 10;
    let board = this.createBoard(dim, dim);
    this.state = {
      board: board,
    };
  }

  createBoard = (row, col) => {
    return Array(row).fill(Array(col).fill(0));
  }

  // createBoard = (rows, cols) => {
  //   let board = [];
  //   for (let i = 0; i < rows; i++) {
  //     let row = [];
  //     for (let j = 0; j < cols; j++) {
  //       row.push(0);
  //     }
  //     board.push(row);
  //   }
  //   console.log(board);
  //   return board;
  // }

  movePlayer = () => {

  }

  componentDidMount() {
    this.setPiece(this.props.player);
  }

  setPiece = (loc) => {
    let brd = this.state.board;
    const row = loc[0];
    const col = loc[1];
    console.log('row: '+row+' col: '+col+' ==='+brd[row][col]);
    brd[row][col] = 'player';
    console.log('setPiece: ',brd);
    this.setState({board: brd});
  }

  renderCell = (cell) => {
    switch(cell) {
      case 0:
        return 'floor';
      case 1:
        return 'wall';
      case 'player':
        return 'player';
      default:
        return 'floor';
    }
  }

  render() {
    return (
      <div className='board'>
      {this.state.board.map((row, i) => {
        return row.map((cell, j) => {
          return (
            <Cell
              key={[i, j]}
              loc={[i, j]}
              type={this.renderCell(cell)}
            />
          );
        })
      })}
      </div>
    );
  }
}

export default Board;

您正在使用Array#fill正确。Array#fill用相同的值填充数组单元格:

  1. 创建子数组 - Array(col).fill(0)
  2. 所有行数组都用数组引用填充 - Array(row).fill(Array(col).fill(0))

为了防止这种情况,您可以使用其他数组创建方法,即创建而不是克隆值。例如Array#from:

const row = 10;
const col = 5;
const result = Array.from({ length: row }, () => new Array(col).fill(0));

result[0][2] = 5

console.log(result);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Array.fill 和 for 循环创建数组有什么区别[重复] 的相关文章

随机推荐

  • Rails - 在 link_to 中传递参数

    我的帐户索引页面列出了所有帐户 每个帐户都有一个指向 服务 的链接 这应该将用户定向到 my services new 页面 并使用适当的 ID 预先填充 account id 字段 具体取决于在帐户索引页面上单击的链接 我在每个页面的底部
  • 一种间隔重叠矩形的算法?

    这个问题实际上涉及翻转 我将在下面概括如下 我有一个 2D 视图 并且屏幕上的某个区域内有许多矩形 我如何展开这些盒子 使它们不相互重叠 但仅以最小的移动来调整它们 矩形的位置是动态的并且取决于用户的输入 因此它们的位置可以在任何地方 At
  • 从 Azure 自动化帐户运行时 Get-AzureBlobContent 抛出错误

    我在尝试通过我的 Azure 自动化帐户从 Azure 存储帐户下载 blob JSON 文件 时遇到失败 看起来像是授权问题 这适用于我的本地笔记本电脑 但不适用于 Azure 自动化帐户 即使我将容器设置为 公共 也不起作用 我已为资源
  • 在 SQL Server 2008 中保护敏感信息不被 DBA 获取

    我们的客户需要加密 MOSS 内容数据库 因此如果没有正确的加密密钥 DBA 或未经授权的人员就无法查看内容数据库 SQL Server 2008 中的透明数据加密 TDE 似乎无法保护 DBA 的敏感信息 因为 TDE 旨在保护 静态 数
  • 在 PHP 中使用 DOMPDF 的 PDF 页面中的标题

    我正在使用 DOMPDF 创建 PDF 文件 我有大量内容要提取为 PDF 我们需要在所有页面中添加一些标题 那么谁能告诉我如何在 PDF 中添加页眉和页脚 以便使用 DOMPDF 在所有页面中显示页眉 在 0 6 0 代码中 您将能够使用
  • JQuery 自动建议服务器端[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 事实证明 开发一个服务器端
  • 自动映射器的通用扩展方法

    public abstract class Entity IEntity Key public virtual int Id get set public class City Entity public string Code get s
  • 嵌入对象后面的 jquery 组合框(仅限 IE)

    在 Internet Explorer 中 我有一个 jquery 组合框 它在嵌入对象 例如 pdf 文档 后面打开 如何确保组合框始终位于嵌入对象的前面 请参阅此小提琴的示例 http jsfiddle net RDd3A 258 更新
  • PHP 中用于 Postgresql 查询的列名称的绑定变量

    我需要从 PHP 动态生成需要在 Postgresql 中更新的列名 这是代码和错误 Col dog Num pic query params array user id gt CustomerID dog path gt filePath
  • 越狱iOS设备的应用程序:一致的后台操作

    我是名为 AirFloat 的 Cydia 调整项的作者 实现 AirPlay 音频协议 以前称为 AirTunes 的应用程序 可以传输音频to您的 iOS 设备 AirFloat 最初是一个 App Store 应用程序 直到被 App
  • iPhone X 上停用时 applicationDidBecomeActive 触发

    还有其他人遇到麻烦吗applicationDidBecomeActive错误地开火失活新 iPhone X 上的应用程序是什么 这是我的测试应用程序 class ViewController UIViewController require
  • Node MSSQL - 如何使用内置的 SQL 注入保护

    我正在研究 Node 的 MSSQL 模块中内置的 SQL 注入保护 https www npmjs com package mssql injection 但我并没有完全理解他们如何清理查询值的示例 我猜是request input my
  • Terraform 将 SSL 证书绑定到 Azure WebApp

    我最近一直在尝试使用 Azure 中的 Terraform 将域和 SSL 证书绑定到 Web 应用程序 我在这方面没有运气 而且文档有点混乱 地面上很简单 我在制定计划时遇到的错误是 Error parsing subscriptions
  • JavaScript 中的继承

    当我使用原型在 Javascript 中实现继承时 我遇到了一个奇怪的错误 我想知道是否有人可以解释这一点 在下面的代码中 我正在尝试从父类派生子类 parent class function byref if parent class p
  • 为什么使用ByRef时变量应该被赋值为“.Value”?

    有什么区别 A Something and A Value Something 我发现这仅在以下情况下才有效 Value用来 function main A Original A B Original B SetByRef1 ref A S
  • 在 Joomla 中添加特定于页面的 javascript 或 CSS

    如何仅在 Joomla 的某篇文章中包含 javascript 或 CSS 文件 我有一篇文章需要 jQuery UI 和相关主题 由于它没有在任何其他页面上使用 因此我只需要在这篇特定的文章中使用它 添加必要的
  • 为什么我的应用程序显示我正在请求通讯录权限?

    我有一个表盘应用程序 显示我正在请求联系人权限 但我没有 我不明白这是为什么 我有应用程序内结算功能 并且可以访问 Google Fit 数据 以及 Google Analytics 以下是我的清单中的权限列表
  • 如何基于现有文件数据库创建具有架构的内存数据库

    我有一个现有的数据库 其结构在整个应用程序中使用 数据库的实例会定期轮换 我有一个数据库文件template sqlite它用作所有新创建的数据库的模板 我想使用它 而不是创建脚本 这样我只需维护一个文件 即空数据库模板本身 我想基于该模板
  • 什么标准调用实际上是宏

    我问了一个问题here about assert它在标准中作为宏而不是函数实现 这给我带来了一个问题 因为这样的方式assert从接受参数的角度来看 它似乎是一个函数 assert true 因此我尝试将其用作 std assert tru
  • Array.fill 和 for 循环创建数组有什么区别[重复]

    这个问题在这里已经有答案了 我正在使用 React js 创建一个地下城爬行游戏 并使用 Array fill 0 初始化棋盘 但是当我在二维数组中设置一个元素时 它将整个数组 列 设置为 player 而不是单一元素 我还有一个creat