Javascript 迭代关联数组的前x个元素

Javascript 迭代关联数组的前x个元素,javascript,arrays,loops,iterator,iteration,Javascript,Arrays,Loops,Iterator,Iteration,具有12个元素的关联数组 this.rolls = {1:[], 2:[], 3:[], 4:[], 5:[], 6:[], 7:[], 8:[], 9:[],10:[], 11:[], 12:[]}; var sum = 0; for (var k in this.rolls) { vals = this.rolls[k]; for (var i=0; i<vals.length; i++) { sum += val

具有12个元素的关联数组

 this.rolls = {1:[], 2:[], 3:[], 4:[], 5:[],
                6:[], 7:[], 8:[], 9:[],10:[], 11:[], 12:[]};
  var sum = 0;
  for (var k in this.rolls) {
    vals = this.rolls[k];
    for (var i=0; i<vals.length; i++) {
      sum += vals[i] || 0
    };
  };
  this.score = sum
获得前10个元素之和最有效的方法是什么。下面的代码当前汇总了所有元素

 this.rolls = {1:[], 2:[], 3:[], 4:[], 5:[],
                6:[], 7:[], 8:[], 9:[],10:[], 11:[], 12:[]};
  var sum = 0;
  for (var k in this.rolls) {
    vals = this.rolls[k];
    for (var i=0; i<vals.length; i++) {
      sum += vals[i] || 0
    };
  };
  this.score = sum
以下是完整的代码:

function Game() {
  this.score = 0;
  this.frameOver = false;
  this.rolls = {1:[], 2:[], 3:[], 4:[], 5:[],
                6:[], 7:[], 8:[], 9:[],10:[], 11:[], 12:[]};
  this.currentFrame = 1;
  // this.lastFrameStrike = false;
  // this.lastFrameSpare = false;
  // this.isStrike = false
};

Game.prototype.roll = function(pins) {
  this.strikeOrSpare(pins);
  this.bonusDistributor(pins);
  this.rolls[this.currentFrame].push(pins);
  this.scoreUpdater(pins);
  this.frameHandler(pins);
  this.nextFrameBonus(pins)
};

// --------------------------------------------------

Game.prototype.strikeOrSpare = function(pins) {
  if (pins === 10) {
    this.isStrike = true;
    this.frameOver = true
  }
  else if (this.rolls[this.currentFrame][0] + pins === 10) {
    this.isSpare = true;
    this.frameOver = true
  };
};

// --------------------------------------------------

Game.prototype.bonusDistributor = function(pins) {
  if(this.wasSpare) { this.addToLastSpare(pins) };
  if(this.wasStrike) { this.addToLast(pins) };
  if(this.wasStrike2 && this.currentFrame > 1) { this.addToLastAgain(pins) };
};

// --------------------------------------------------

Game.prototype.addToLast = function(pins) {
  this.rolls[this.currentFrame - 1][0] += pins
};

Game.prototype.addToLastAgain = function(pins) {
  this.rolls[this.currentFrame - 2][0] += pins
};

Game.prototype.addToLastSpare = function(pins) {
  this.rolls[this.currentFrame - 1][1] += pins;
  this.wasSpare = false
};

// --------------------------------------------------

Game.prototype.scoreUpdater = function(pins) {
  var sum = Object.keys(this.rolls).sort(function (a, b) {
      return (+a) - (+b);
  }).slice(0, 10).reduce(function (p, c) {
      return p + this.rolls[c].reduce(function (p, c) {
          return p + c;
      }, 0);
  }, 0);
};

Game.prototype.frameHandler = function(pins) {
  if (this.frameOver) {
    this.currentFrame++; this.frameOver = !this.frameOver
  } else {
  this.frameOver = !this.frameOver;
  };
};

Game.prototype.nextFrameBonus = function(pins) {
  if (this.isSpare) {
    this.wasSpare = true;
    this.isSpare = false
    if (this.wasStrike) {
      this.wasStrike = false;
      this.wasStrike2 = true
    }
  } else if (this.isStrike && this.wasStrike) {
    this.wasStrike2 = true
  } else if (this.isStrike) {
    this.isStrike = false;
    this.wasStrike = true
  } else if (this.wasStrike) {
    this.wasStrike = false;
    this.wasStrike2 = true
  } else if (this.wasStrike2) {
    this.wasStrike2 = false
  };
};

// --------------------------------------------------

您遇到的第一个问题是
this.rolls
是一个
对象,而不是
数组,因此
for(此.rolls中的var k)
不能保证按顺序枚举键。所以要解决的第一个问题是取前10个键,将它们转换成数字,然后对它们进行排序。这里我使用的是所有本机
数组
对象
方法:

var rolls = this.rolls;
var sum = Object
  // Get all keys
  .keys(rolls)
  // Convert string keys to integers
  .map(function (key) { return parseInt(key, 10); })
  // Sort in ascending order
  .sort()
  // Take the first 10
  .slice(0, 10)
  // Get the arrays for each key
  .map(function (key) { return rolls[key]; })
  // Merge all arrays into one array
  .reduce(function (allNumbers, array) { return allNumbers.concat(array); }, [])
  // Sum all numbers
  .reduce(function (sum, number) { return sum + (number || 0); }, 0);

您遇到的第一个问题是
this.rolls
是一个
对象,而不是
数组,因此
for(此.rolls中的var k)
不能保证按顺序枚举键。所以要解决的第一个问题是取前10个键,将它们转换成数字,然后对它们进行排序。这里我使用的是所有本机
数组
对象
方法:

var rolls = this.rolls;
var sum = Object
  // Get all keys
  .keys(rolls)
  // Convert string keys to integers
  .map(function (key) { return parseInt(key, 10); })
  // Sort in ascending order
  .sort()
  // Take the first 10
  .slice(0, 10)
  // Get the arrays for each key
  .map(function (key) { return rolls[key]; })
  // Merge all arrays into one array
  .reduce(function (allNumbers, array) { return allNumbers.concat(array); }, [])
  // Sum all numbers
  .reduce(function (sum, number) { return sum + (number || 0); }, 0);

对对象键进行排序和筛选,然后使用它们将数组缩减为和

var rolls = this.rolls;
var sum = Object.keys(rolls).sort(function (a, b) {
    return (+a) - (+b);
}).slice(0, 10).reduce(function (p, c) {
    return p + rolls[c].reduce(function (p, c) {
        return p + c;
    }, 0);
}, 0);

对对象键进行排序和筛选,然后使用它们将数组缩减为和

var rolls = this.rolls;
var sum = Object.keys(rolls).sort(function (a, b) {
    return (+a) - (+b);
}).slice(0, 10).reduce(function (p, c) {
    return p + rolls[c].reduce(function (p, c) {
        return p + c;
    }, 0);
}, 0);

编辑:您的示例中有一个错误。您不能使用。在
forEach
内滚动。声明它(
var self=this;
或我的版本是
var rolls=this.rolls;
外部)

我建议使用以下代码来计算总和:

var sum = 0;
var rolls = this.rolls;
Object.keys(rolls).forEach(function (key, i, array) {
    if (i < 10) {
        var item = rolls[key].slice();
        while (item.length) {
            sum += item ? Number(item.shift()) : 0 + item ? Number(item.pop()) : 0;
        }
    }
});
console.log(sum, this.rolls);
this.score = sum;
var总和=0;
var rolls=this.rolls;
Object.key(rolls).forEach(函数(key,i,数组){
如果(i<10){
var item=rolls[key].slice();
while(项目长度){
总和+=项目编号(item.shift()):0+项目编号(item.pop()):0;
}
}
});
console.log(sum,this.rolls);
这个分数=总和;
下面是您的完整示例:

函数游戏(){
这个分数=0;
this.frameOver=false;
this.rolls={1:[]、2:[]、3:[]、4:[]、5:[]、6:[]、7:[]、8:[]、9:[]、10:[]、11:[]、12:[];
此.currentFrame=1;
//this.lastFrameStrike=false;
//this.lastFrameSpare=false;
//this.isStrike=false
}
Game.prototype.roll=功能(PIN){
此。删除或删除(销);
此。bonusDistributor(PIN);
this.rolls[this.currentFrame].推(销);
这个.scoreUpdater(pins);
这个.frameHandler(pins);
此.nextFrameBonus(PIN);
};
// --------------------------------------------------
Game.prototype.strikeOrSpare=函数(PIN){
如果(引脚===10){
this.isStrike=true;
this.frameOver=true;
}
else if(this.rolls[this.currentFrame][0]+引脚===10){
this.isSpare=true;
this.frameOver=true;
}
};
// --------------------------------------------------
Game.prototype.bonusDistributor=函数(PIN){
如果(这个是备用的){
此项。添加最新备件(引脚);
}
如果(这是罢工){
这是addToLast(pins);
}
if(this.wastrike2&&this.currentFrame>1){
这是addToLastAgain(pins);
}
};
// --------------------------------------------------
Game.prototype.addToLast=函数(引脚){
this.rolls[this.currentFrame-1][0]+=引脚;
};
Game.prototype.addToLastAgain=函数(引脚){
this.rolls[this.currentFrame-2][0]+=引脚;
};
Game.prototype.addToLastSpare=功能(引脚){
this.rolls[this.currentFrame-1][1]+=引脚;
this.waspare=false;
};
// --------------------------------------------------
Game.prototype.scoreUpdater=函数(PIN){
var总和=0;
//var self=这个;
var rolls=this.rolls;
Object.key(rolls).forEach(函数(key,i,数组){
如果(i<10){
var item=rolls[key].slice();
while(项目长度){
总和+=项目编号(item.shift()):0+项目编号(item.pop()):0;
}
}
});
console.log(sum,this.rolls);
这个分数=总和;
};
Game.prototype.frameHandler=函数(PIN){
if(this.frameOver){
这个.currentFrame++;
this.frameOver=!this.frameOver;
}否则{
this.frameOver=!this.frameOver;
}
};
Game.prototype.nextFrameBonus=功能(PIN){
如果(本文件为附件){
this.waspare=true;
this.isSpare=false;
如果(这是罢工){
this.wastrike=false;
this.wastrike2=真;
}
}else if(this.isStrike&&this.wastrike){
this.wastrike2=真;
}否则如果(this.isStrike){
this.isStrike=false;
this.wastrike=true;
}否则,如果(这是罢工){
this.wastrike=false;
this.wastrike2=真;
}else if(this.wastrike2){
this.wastrike2=false;
}
};
var game=新游戏();

game.scoreUpdater()编辑:您的示例中有一个错误。您不能使用。在
forEach
内滚动。声明它(
var self=this;
或我的版本是
var rolls=this.rolls;
外部)

我建议使用以下代码来计算总和:

var sum = 0;
var rolls = this.rolls;
Object.keys(rolls).forEach(function (key, i, array) {
    if (i < 10) {
        var item = rolls[key].slice();
        while (item.length) {
            sum += item ? Number(item.shift()) : 0 + item ? Number(item.pop()) : 0;
        }
    }
});
console.log(sum, this.rolls);
this.score = sum;
var总和=0;
var rolls=this.rolls;
Object.key(rolls).forEach(函数(key,i,数组){
如果(i<10){
var item=rolls[key].slice();
while(项目长度){
总和+=项目编号(item.shift()):0+项目编号(item.pop()):0;
}
}
});
console.log(sum,this.rolls);
这个分数=总和;
下面是您的完整示例:

函数游戏(){
这个分数=0;
this.frameOver=false;
this.rolls={1:[]、2:[]、3:[]、4:[]、5:[]、6:[]、7:[]、8:[]、9:[]、10:[]、11:[]、12:[];
此.currentFrame=1;
//this.lastFrameStrike=false;
//this.lastFrameSpare=false;
//this.isStrike=false
}
Game.prototype.roll=功能(PIN){
此。删除或删除(销);
此。bonusDistributor(PIN)