【问题标题】:Removing a String from an Array, but adding the Number amount back in Javascript从数组中删除字符串,但在 Javascript 中添加数字量
【发布时间】:2021-07-06 06:35:20
【问题描述】:

我正在尝试为国际象棋创建一个 FEN 符号转换器。我已经决定解决这个问题的最佳方法是从字符串中删除我不需要的任何不必要的值。这是它的样子。

rnbqkbnr/pppppppp/8/

这些都是我代码中的字符串。我已经找到了每个文件末尾的解决方案,该文件由字符串中的 / 表示。但我的新问题是去掉数字值并添加回空白方块以覆盖它们。

当您在 FEN 中看到一个数字时,这实际上是国际象棋桌上有多少个空方格,直到另一个棋子。我的想法再次为自己简化,是将这些数字(如 8)转换为 11111111 一系列数字,代表每个必须为空的方格。

在实践中,我假设我只能将 splice8 输出并开始使用 1 填充该索引,这似乎是可行的选择,但不幸的是,当将号码移动到不同的地方。

有人对此有更好的选择吗?是的,我知道已经有库可以做到这一点,但是如果你不尝试重新发明轮子,编码还有什么乐趣呢。

correctFen 函数 - 映射字符串以查找任何数字

  const correctFen = () => {
    newFen.map((pos, index) => {
      if (Number(pos) && pos !== '/'){
        for (let i = 0; i < Number(pos); i++) {
          console.log('firing')
          setNewFen(addAfter(newFen, index + i, '1'))
        }
      }
    })
    console.log(newFen)
    figureOutPos()
  }

看了这个之后,它并没有真正删除我想要的索引,这可能是一个问题,它在最后一个 / 之后添加了 1s

function addAfter(array, index, newItem) {
  return [
    ...array.slice(0, index),
    newItem,
    ...array.slice(index)
  ];
}

【问题讨论】:

  • 你的想法不错;如果有错误,它们在实现中,所以请发布代码。
  • 欢迎来到 Stack Overflow!访问help center,使用tour 来查看内容和How to Ask。如果遇到困难,请发布您尝试的minimal reproducible example,并使用[&lt;&gt;] sn-p 编辑器记录输入和预期输出。跨度>
  • 如果您使用chessString.split('/') 将字符串拆分为一个数组,那么您可以将.map() 拆分为一个新数组,其中该函数将数字替换为指定长度的字符串:jsfiddle.net/po2c3dfv
  • @Thomas 添加了一些我的原始代码以帮助解释更多。我相信这个问题只是我没有弄清楚的小问题。
  • 评论系统就是这样工作的 :) 无论如何,改变 React 状态是异步的。您需要先编写完整的新字符串,然后才能调用setNewFen

标签: javascript reactjs loops chess fen


【解决方案1】:

看起来您正在从 map 回调修改 newFen。这确实会弄乱索引,因为当前索引之后的所有内容都会发生变化。

相反,从map 回调中返回新字符。在大多数情况下,这将是原始字符,但如果它是一个数字,您将返回一个由多个字符组成的字符串。然后再次将数组连接成一个字符串。

类似这样的:

// Assuming newFen is a string in some outer scope.
const correctFen = () => {
  const correctedFen = newFen
    // Split the string into an array of single characters.
    .split('')
    // Apply a function to each character and gather the results in an array.
    .map((char, _index) => {
      // Try to parse `char` as an integer.
      const number = parseInt(char)
      if (isNaN(number)) {
        // `char` is not a digit. Return the character itself.
        return char
      } else {
        // `char` is a digit. Return a string of that many 1s.
        return '1'.repeat(number)
      }
    })
    // Join the array back into a string.
    .join('')
  setNewFen(correctedFen)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    • 2016-05-30
    • 2014-12-18
    相关资源
    最近更新 更多