所需
我有多个玩家阵列roundWinners
,在FOR循环中迭代。对于每个数组,我需要分配给新变量winner
的数组的MODE(最常出现的值)。
我很遗憾从哪里开始,所以我想问一下最有效的方法是什么?
示例:
for (i = 0; i < numberOf; i++) {
var roundWinners[0] = ["Joe", "Joe", "Bob", "Sue"]
var winner[0] ="Joe";
var roundWinners[1] = ["Joe", "Sue", "Bob", "Sue"]
var winner[1] ="Sue";
var roundWinners[2] = ["Bob", "Bob", "Bob", "Sue"]
var winner[2] ="Bob";
}
答案 0 :(得分:1)
在循环之前,创建一个对象。
var ArrMode = {};
然后,在每次迭代时,取名称,并使用它作为属性名称,查看该对象是否具有该名称的属性。如果是这样,请增加该属性的值。
如果没有,添加该属性,将其值设置为1。
处理完阵列后,使用简单的replace-if-greater测试处理对象。每次进行替换时,请将该属性的名称保留为获胜者。
处理完整个对象后,您持有的属性名称是获胜者的名称。
答案 1 :(得分:0)
我实际上没有答案
当你在设计时不知道属性名称时,有人发布了这个作为迭代JS对象属性的方法:
for (var property in object) {
if (object.hasOwnProperty(property)) {
// do stuff
}
}
您可以随时使用以下命令向JS对象添加属性:
obj[theName] = theVal; // the name’d be a string, theVal’d be anything
// Like:
var theName = "John";
obj[theName] = 1;
所以,你应该在循环之前用一个名字创建一个空对象(比如说&#34;模式&#34;),但没有属性
var modes = {};
然后,在对数组的每次迭代中,遍历对象的属性,根据数组中的当前名称检查属性的名称。
如果找到,请使用:
modes[arr[i]]++;
如果未找到,请使用
modes[arr[i]] = 1;
迭代数组后,迭代对象的属性,检查它们的值,并记住&#39;最高的名称和价值。
答案 2 :(得分:0)
<强>工作:强>
//Mode Calc
function mode( arr ) {
if ( !Array.isArray( arr ) ) {
throw new TypeError( 'mode()::invalid input argument. Must provide an array.' );
}
var len = arr.length,
count = {},
max = 0,
vals = [],
val;
for ( var i = 0; i < len; i++ ) {
val = arr[ i ];
if ( !count[ val ] ) {
count[ val ] = 0;
}
count[ val ] += 1;
if ( count[ val ] === max ) {
vals.push( val );
} else {
max = count[ val ];
vals = [ val ];
}
}
return vals.sort( function sort( a, b ) {
return a - b;
});
} // end FUNCTION mode()
for (i = 0; i < numberOf; i++) {
winner = ( mode( roundWinners[i] ) );
}