javascript - Array.fill 和创建数组的 for 循环有什么区别

标签 javascript reactjs multidimensional-array

<分区>

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

这是我的 Board 组件:

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);

关于javascript - Array.fill 和创建数组的 for 循环有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44749597/

相关文章:

javascript - 如果变量包含非数字字符则发出警报?

javascript - MongoDB/Mongoose中索引号有何意义

javascript - 如何避免setInterval过慢?

javascript - 为什么我无法加载 API?

php - PHP 多维数组丢失的值

c# - 调整和初始化二维数组 C#

javascript - setBackGroundRGB 不接受字符串

javascript - ReactJS 和分离模型

javascript - 使用功能组件传递 props,而不在组件内声明功能

javascript - 循环遍历 Javascript 数组