Javascript .forEach方法将更新应用于数组中的所有项,而不是单个项

Javascript .forEach方法将更新应用于数组中的所有项,而不是单个项,javascript,html,arrays,Javascript,Html,Arrays,我正在为我的一些学生做一个小练习,我正在自动进行一种10针保龄球游戏,我把它放在了一个JsBin中。我不知道我是累了,还是傻了,还是因为我在国庆节工作,但有些事情让我困惑。当我开始游戏时,我会提示用户设置一些想要的玩家。这会自动生成一个玩家对象数组,如下所示: [{score: Array[10], spareCount: 0, strikeCount: 0, username: "Player 1"}, ...] 现在,稍后我允许用户播放帧,其中阵列中的每个玩家有两次投掷。。。我收集分数并将

我正在为我的一些学生做一个小练习,我正在自动进行一种10针保龄球游戏,我把它放在了一个JsBin中。我不知道我是累了,还是傻了,还是因为我在国庆节工作,但有些事情让我困惑。当我开始游戏时,我会提示用户设置一些想要的玩家。这会自动生成一个玩家对象数组,如下所示:

[{score: Array[10], spareCount: 0, strikeCount: 0, username: "Player 1"}, ...]
现在,稍后我允许用户播放帧,其中阵列中的每个玩家有两次投掷。。。我收集分数并将其添加到特定玩家的分数数组中。但是,当我尝试使用.forEach方法执行此操作时,我生成的分数将应用于我的玩家数组中的所有项目(玩游戏并查看)。我已将代码放入jsBin,问题出现在第109行:
a.score[currentFrame-1]=playFrame()

我已经尝试修改我的代码,但我无法理解为什么当前(或最后)帧分数应用于所有玩家对象!如果你能理解我的语法错误并解释为什么我会非常感激。玩游戏(设置玩家号码后点击按钮),你就会明白我的意思

片段:

var玩家,
currentFrame=0,
currentThrow=0;
//辅助函数
//精确的isNumber函数。。。谢谢Crockford(参见JavaScript:好的部分)
函数isNumber(值){
返回typeof(value=='number')&&isFinite(value);
}
函数框架样式(k){
var returnCssClass,
k=k+1;
if(k<当前帧){
returnCssClass='播放帧';
}else if(k==当前帧){
returnCssClass='当前帧';
}否则{
returnCssClass=null;
}
返回CSSClass;
}
函数设置播放器(num){
var tempArray=[],
tempName='Player',
emptyScores=Array(10).fill([-1,-1]);//将默认值设置为-1,因为垃圾玩家可能不会命中任何PIN!
对于(变量i=0;i0)?d:0));
}, 0);
}, 0);
返回总分;
}
函数显示分数(score){
//toDo重新格式化!
var formatScore=score.map(函数(a,b){
如果(a==-1){
a='-';
}如果(a==10),则为else{
a='X';
}
返回a;
});
返回分数;
}
函数createGrid(){
//如果我使用ES6,我就可以获得多线支持!
var playerLen=players.length,
scoresLen=players[0].score.length;
董事会=“”+
'';
//需要通过玩家循环这个过程。。。
对于(变量i=0;i=10){
宣布胜利者();
}否则{
currentFrame++;
//为每个玩家做投掷动作!
players.forEach(函数(a,b){
a、 分数[currentFrame-1]=playFrame();
});
//更新网格
createGrid();
//复发。。。。
//startGame();
}
}
功能throwBall(pinsStanding){
//我知道这不是一个球
返回Math.floor(Math.random()*(pinssranding+1));
}
函数playFrame(){
//在这里,我们只需创建阵列,并确定是否有攻击或备用!
var pinsStanding=10,
frameScore=[],
frameThrows=2,
品斯敦;
对于(变量i=0;i
正文{
字体系列:“Helvetica Neue”,Helvetica,Arial,无衬线;
}
/*班级*/
.记分牌{
边框:1px实心#000;
}
.行{
显示:块;
边框底部:1px实心#000;
}
.排:最后一个孩子{
边框底部:无;
}
.行>分区{
显示:内联块;
填充物:5px;
}
.游戏{
右边框:1px实心#000;
}
.姓名{
背景色:#F5;
右边框:1px实心#000;
}
.球员总数{
文本对齐:右对齐;
背景色:#d5eabb;
}
.播放的帧{
背景色:#aee1e8;
}
.当前帧{
背景色:#ffc0cb;
}

JS-Bin
我们去打保龄球吧!

您需要调用
数组(10)。在for循环中填充([-1,-1])
,否则所有对象将共享相同的分数数组:

function setUpPlayers(num) {

    var tempArray = [],
        tempName = 'Player '; 

    for (var i = 0; i < num; i++) {
        tempArray.push({
            username: tempName + (i + 1),
            score: Array(10).fill([-1, -1]),// set default to -1 as a rubbish player may hit no pins!
            strikeCount: 0,
            spareCount: 0
        }); // the way I have named the tempName is technically an antipattern!
    }

    return tempArray;
}
函数设置播放器(num){
var tempArray = [],
    tempName = 'Player ';

for (var i = 0; i < num; i++) {
    var emptyScores = Array(10).fill([-1, -1]);
    tempArray.push({
        username: tempName + (i + 1),
        score: emptyScores,
        strikeCount: 0,
        spareCount: 0
    });
}