Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 类型错误:记分员不可编辑_Javascript_Reactjs - Fatal编程技术网

Javascript 类型错误:记分员不可编辑

Javascript 类型错误:记分员不可编辑,javascript,reactjs,Javascript,Reactjs,下面的代码给出了 类型错误:记分员不可编辑 似乎只有在以下情况下才会出现此问题: existingScorer = true 我在谷歌搜索后找到了这个答案 尝试迭代整数值时引发错误。要解决此错误,请确保迭代的是一个iterable,而不是一个数字。 但是MDN说 一些内置的构造(如spread语法)在后台使用相同的迭代协议 你能告诉我我能做什么吗 提前谢谢 /彼得 编辑:my app.js const[scorers,setScorers]=useState([ {id:nanoid(4)

下面的代码给出了

类型错误:记分员不可编辑

似乎只有在以下情况下才会出现此问题:

existingScorer = true 
我在谷歌搜索后找到了这个答案

尝试迭代整数值时引发错误。要解决此错误,请确保迭代的是一个iterable,而不是一个数字。 但是MDN说 一些内置的构造(如spread语法)在后台使用相同的迭代协议

你能告诉我我能做什么吗

提前谢谢 /彼得

编辑:my app.js

const[scorers,setScorers]=useState([
{id:nanoid(4),编号:9,总数:99},
{id:nanoid(4),编号:1,总数:11},
{id:nanoid(4),编号:15,总数:9},
]);
const sortedScorers=[…scorers].sort((a,b)=>a.number-b.number);
const onePointScoredHandler=()=>{
常量玩家=[…记分员];
const existingScorer=players.find((player)=>player.number===+number);
if(现有记分员){
log('exist');
existingScorer.totPoints=设置点((prevState)=>prevState+1);
设置记分器(现有记分器);
}否则{
console.log('new');
常数新闻采集器={
id:nanoid(4),
编号:+number,
总积分:总积分+1,
};
记分员([…记分员,新闻记分员]);
//设定值(totPoints);
}
设置编号(“”);
控制台日志(记分器);
};
返回(
个别点



setNumber(e.target.value)} />

加1便士

身份证件 数 总分 {分拣机 .sort((a,b)=>a.number-b.number) .map((播放器)=>( {player.id} {player.number} {player.totPoints} ))} ); };
正如@aleksxor已经指出的,问题在于以下几行

setScorers(existingScorer);
其中,
existingScorer
似乎是单个对象。现在,在上面一行中,您将使用单个对象覆盖现有的
记分器
数组。因此,当您稍后尝试在扩展语法中使用
scorers
数组
[…scorers]
时,这不再有效,因为
scorers
现在是一个对象而不是数组

一个简单的修复方法是将上面的行替换为

setScorers([existingScorer]);
但是请注意,这将覆盖现有的记分器数组,即,如果它已经包含一些元素,它们将从该数组中消失。因此,您可能需要将新元素附加到现有数组中,或者将值与现有数组中的元素合并

let s = scorers.find(x => x.number === existingScorer.number);
if (s)
  s.totPoints = existingScorer.totPoints;
else 
  setScorers([...scorers, existingScorer])
只要不深度复制玩家,就可能不需要更新
scorers
数组中的记分器,因为所有引用都指向同一个对象。因此,只需检查玩家是否已包含在
记分者
数组中,如果已包含,则不附加它

let s = scorers.find(x => x.number === existingScorer.number);
if (!s)
  setScorers([...scorers, existingScorer])

您还可以通过以下方式更改功能逻辑以实现所需的结果:

const onePointScoredHandler = () => {
  const players = [...scorers];
  const pos = players.map((player) => player.number).indexOf(+number);

  if (pos !== -1) {
    console.log("exist");
    players[pos].totPoints = setTotPoints((prevState) => prevState + 1);
    setScorers(players);
  } else {
    console.log("new");
    const newScorer = {
      id: nanoid(4),
      number: +number,
      totPoints: totPoints + 1,
    };
    setScorers([...scorers, newScorer]);
    setTotPoints(totPoints);
  }
  setNumber("");
  console.log(scorers);
};
``

什么是得分者?请给我们看看是什么?(github链接应始终伴随问题本身的代码示例)请将代码的相关部分添加到您的问题中。没有人对在某个github存储库中挖掘感兴趣。。。至于你的问题:似乎
scorer
不是数组,所以你不能在扩展语法中使用它。。。没有人知道现有的Scorer是什么,或者它与上面显示的代码有什么关系。。。将该行更改为
setScorers([existingScorer])
。我相信现有的记分器本身并不是一个数组。@derpirscher:很抱歉我的失误,答应我下一步做得更好time@evolutionxbox:对不起,我错了,我现在有了原始问题中的代码谢谢你的帮助:-)我为我的答复晚了表示歉意,但我在PICU连续上了很多夜班。
const onePointScoredHandler = () => {
  const players = [...scorers];
  const pos = players.map((player) => player.number).indexOf(+number);

  if (pos !== -1) {
    console.log("exist");
    players[pos].totPoints = setTotPoints((prevState) => prevState + 1);
    setScorers(players);
  } else {
    console.log("new");
    const newScorer = {
      id: nanoid(4),
      number: +number,
      totPoints: totPoints + 1,
    };
    setScorers([...scorers, newScorer]);
    setTotPoints(totPoints);
  }
  setNumber("");
  console.log(scorers);
};
``