Javascript 迭代关联数组的前x个元素
具有12个元素的关联数组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
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)