寻找模式通过FOR循环迭代多个数组

时间:2014-12-23 17:12:46

标签: javascript arrays loops math

所需

我有多个玩家阵列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";
}

3 个答案:

答案 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] ) );
}