查找模式 遍历多个数组的 FOR 循环

Finding MODE Iterating through FOR Loop for multiple arrays

本文关键字:FOR 循环 数组 模式 遍历 查找      更新时间:2023-09-26

Desired:

我有多个播放器数组,roundWinners ,在 FOR 循环中被迭代。 对于每个数组,我需要将数组的 MODE(最常出现的值)分配给新变量 winner

我不知道从哪里开始,所以我问实现这一目标的最有效方法是什么?

例:

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";
}

在循环之前,创建一个对象。

    var ArrMode = {};

然后,在每次迭代中,获取名称,并将其用作属性名称,查看对象是否具有该名称的属性。如果是这样,请递增该属性的值。

如果没有,请添加该属性,并将其值设置为 1。

处理数组后,使用简单的替换如果更大测试来处理对象。每次更换时,请将该属性的名称作为获胜者。

处理完整个对象后,您持有的属性名称就是获胜者的名称。

我实际上没有答案

一个人发布了这个作为循环访问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;

因此,您将在循环之前创建一个空对象,其中包含名称(例如,例如"模式"),但没有属性

    var modes = {};

然后,在数组的每次迭代中,循环访问对象的属性,根据数组中的当前名称检查属性的名称。

如果找到,则使用:

    modes[arr[i]]++;

如果未找到,则使用

    modes[arr[i]] = 1;

历数组后,迭代对象的属性,检查它们的值,并"记住"最高属性的名称和值。

工作:

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