如何在运行重复计数后找到数组中重复值的索引?

时间:2012-04-27 09:05:50

标签: javascript jquery

我知道有类似的问题已被提出,但我已经仔细研究了这些问题并且绝对感到困惑,因为a)它们是如何工作的,以及b)我如何调整它们以符合我的目的。因此,我开始提出一个新问题。

我有一个只有4个索引的数组,每个索引都有一个数字。我的目标是找到此数组中的最低值并返回该最低值的索引。这不是问题......

当在多个索引中重复最低值时会出现问题。

在这种情况下,我希望能够首先运行"计数"在数组上查找是否重复了最低值,然后如果计数> 1则执行以下操作:找到重复值的索引,最后我需要取这些索引的值并进行更早的计算找到它们之间的最低值。

示例:

    array[ 12.44 , 10.33 , 17.45 , 10.33]
    //First I need a count to find the number of times the lowest value (10.33) occurs
    //Then I would like a function to return either a string containing 1,3 to 
    //represent the indices, or an array[ 1 , 3 

如果这个问题已经得到回答,我再次道歉,但请你解释一下答案,因为我已多次尝试了解他以前的答案并且无法提醒。

为什么使用js在数组中找到重复值是如此复杂?

提前感谢您的帮助和时间!

约翰

3 个答案:

答案 0 :(得分:1)

纯JS的这种方式怎么样?

var myArr = [12.44 , 10.33 , 17.45 , 10.33];  //Your array    
var lowest = Math.min.apply(Math, myArr);     //Find the lowest number
var count = 0;                                //Set a count variable
var indexes = [];              //New array to store indexes of lowest number

for(var i=0; i<myArr.length;i++) //Loop over your array
{
    if(myArr[i] == lowest) //If the value is equal to the lowest number
    {
       indexes.push(i); //Push the index to your index array
       count++;         //Increment your counter
    }
}
alert(count);           //2
alert(indexes);         //1, 3

和一个有效的jsFiddle here

答案 1 :(得分:0)

你可以创建一个过滤器,过滤掉所有重复项,然后在临时数组上运行一些魔法来获得所需的数字。例如

var arr      = [ 12.44 , 10.33 , 17.45 , 10.33],
    filtered = [ ],
    lowest;

arr.forEach(function( value ) {
    if( filtered.indexOf( value ) === -1 )
        filtered.push( value );
});

lowest = Math.min.apply( null, filtered );  // 10.33
arr.indexOf( lowest ); // 1

答案 2 :(得分:0)

var arr = [12.44, 10.33, 17.45, 10.33],
    lowest = Math.min.apply(Math, arr), //.. 10.33
    index = $.map(arr, function(o,i) { if (o === lowest) return i; }), //.. [1,3]
    numOfTimes = index.length; //.. 2

<强>解释

Math.min是一个功能。您可以使用function.call(context, param1, param2, paramEtc...)function.apply(context, param[])调用任何函数并更改该函数的上下文。

Math.min不允许我们通过调用Math.min(arr)来传入数组,因为它期望以逗号分隔的参数列表;这就是为什么我们有这个有趣的语法Math.min.apply(Math, arr)

$.map()只是一个方便的迭代器,您可以使用任何方法来获取索引数组