2012-04-27 24 views
1

我知道類似的問題已經被問到,但我已經仔細研究過這些問題,並且對於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在數組中找到重複的值會如此複雜?

在此先感謝您的幫助和時間!

約翰

回答

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()僅僅是一個方便的迭代器,你也可以使用任何方法來獲得指標

+0

underscore.js是什麼?這會返回兩個指數嗎?還是隻有一個? – TranquilityEden 2012-04-27 09:18:22

+0

@TranquilityEden:我刪除了該評論,因爲使用jquery的代碼只是乾淨。 Underscore.js是一個非常強大的JavaScript庫。如果你經常使用js,你應該熟悉它。 – rkw 2012-04-27 09:23:31

+0

啊我想我明白了。我會嘗試將其插入到我的代碼謝謝你的幫助! – TranquilityEden 2012-04-27 09:30:25

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 
+0

謝謝你們的性反應!所以我正確的是,你正在通過arr檢查索引值對「value」,然後用重複的值填充一個名爲「filtered」的新數組?我是索引後的,而不是重複的值。我很抱歉,如果我是昏暗的...... – TranquilityEden 2012-04-27 09:16:47

+0

@TranquilityEden:是的,基本上我正在那樣做。創建一個沒有重複的新數組,然後獲取原始數組中的索引。實際上,將索引從已過濾數組中取出更爲正確,因爲在原始數組中可能不存在或錯誤一些索引。 – jAndy 2012-04-27 09:31:07

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

+0

好吧,我明白了。使用jQuery來完成這項任務,而不是使用jQuery嗎?這個函數每1200毫秒將被調用多達100次 – TranquilityEden 2012-04-27 09:25:13

+0

@TranquilityEden jQuery代碼更加整潔,更加緊湊,正如您在rkws的實現中看到的那樣。我無法評論表現(沒有足夠的經驗),但我無法看出在任何情況下會有多大的差異。 (我確信有人會糾正我)。如果你把這段代碼放到一個可重用的函數中,那麼這是實現你想要的很好的方法。 – 2012-04-27 09:31:11