【问题标题】:How to find the indices of duplicate values in an array after running a count for duplicate?运行重复计数后如何在数组中找到重复值的索引?
【发布时间】:2012-04-27 17:33:19
【问题描述】:

我知道有人问过与此类似的问题,但我已经查看了这些问题,并且对于 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在数组中查找重复值这么复杂?

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

约翰

【问题讨论】:

    标签: javascript jquery


    【解决方案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

    【讨论】:

    • 好的,我明白了。与 javascript 相比,使用 jquery 来完成这项任务有什么优势吗?每 1200 毫秒,此函数将被调用多达 100 次
    • @TranquilityEden jQuery 代码更整洁、更紧凑,正如您在 rkws 的实现中所看到的那样。我无法评论性能(经验不足),但我看不出在任何情况下会有多大差异。 (我相信有人会纠正我)。如果您将此代码放入可重用的函数中,那么这是实现您想要的效果的好方法。
    【解决方案2】:
    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() 只是一个方便的迭代器,您可以使用任何方法来获取索引数组

    【讨论】:

    • 什么是 underscore.js?这会返回两个索引吗?还是只有一个?
    • @TranquilityEden:我删除了该评论,因为使用 jquery 的代码很干净。 Underscore.js 是一个非常强大的小型 javascript 库。如果你经常使用 js,你应该熟悉它。
    • 啊我想我明白了。我将尝试将其插入我的代码中,谢谢您的帮助!
    【解决方案3】:

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

    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
    

    【讨论】:

    • 感谢您的回复!那么我是否正确,您正在通过 arr 检查索引值与“值”,然后用重复值填充一个名为“过滤”的新数组?我在索引之后,而不是在副本的值之后。如果我昏昏沉沉,我很抱歉......
    • @TranquilityEden:是的,基本上我正在这样做。创建一个没有重复的新数组,然后在原始数组中获取索引。实际上,从过滤后的数组中取出索引会更正确,因为某些索引在原始数组中可能不存在或错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    相关资源
    最近更新 更多