2013-12-10 49 views
0

我正在研究名爲SecondGreatLow的coderbyte挑戰。我們給出一個數組作爲參數,並且應該返回給定數組的第二個最低#和第二個最高#。Javascript:難以分析在for循環中包含indexOf的代碼

我正在使用別人的代碼 - 我正在分析/逆向工程它,但我很困惑的一部分。這裏是代碼:

function SecondGreatLow(arr) { 
    var unique = [arr[0]]; 
    for(var i = 1; i < arr.length; i++) { 
    if (unique.indexOf(arr[i]) == -1) { 
     unique.push(arr[i]); 
    } 
    } 
    unique.sort(function(a,b){return a - b}); 
    var smallest = unique[1].toString(); 
    unique.reverse(); 
    var largest = unique[1].toString(); 

    return smallest + " " + largest; 

} 

我有困難與代碼的第一半 - 特別是indexOf語句。

從閱讀黑白線看代碼的下半部分,我相信代碼的第一個上半部分是擺脫所有重複值? - 所有剩餘的非重複值被彈出到唯一數組中,然後我們得到第二低(唯一[1])和第二高(反向數組上的唯一[1])值。

但是,這是什麼if語句呢?

我知道如果indexOf == -1,那麼這意味着找不到特定的項目。

但是,如果我們走通一步一步來......

var unique = [arr[0]]; 

^這是採取第1個要素的值在給定的陣列/參數,並將其存儲在一個名爲陣列「獨特的」

然後有一個for循環開始於索引1(而不是0)

for(var i = 1; i < arr.length; i++) { 

^所以,for循環通過這是作爲一個參數(提供,而不是通第原始數組運行e唯一陣列)。但是,這是從哪裏獲得confused-

if (unique.indexOf(arr[i]) == -1) { 
    unique.push(arr[i]); 

所以我們說我們要通for循環的第一次迭代和I = 1 ...我們想找到ARR [1]的指標,這將是數組的第二個值。但是哪一個? indexOf方法是在「unique」上運行,所以我們找到唯一數組的第二個值的索引(目前只有(arr [0])???或者我們找到第二個值的索引作爲參數傳入的數組?

在第一次運行時,通過for循環在唯一數組中沒有第二個元素/值(因爲只有1個值),所以我們將推送該元素/添加該元素以獨特的陣列。

基本上,我很困惑,什麼樣的代碼的上半部分實際上做。任何幫助,將不勝感激。

如果你想使用一個例子,我想,假設數組[7,7,12,98,106]作爲a傳遞參數...

預先感謝...

回答

1

如果唯一陣列不包含的值匹配ARR [I]中,將其添加到獨特陣列。

循環從i = 1開始的原因是因爲arr [0]已經存儲在唯一的。我們遍歷arr,並檢查唯一性,如果該值不存在,則添加唯一性。

至於你的榜樣,我已經採取了片段,並增加了一些記錄到它。這些是每道次後的結果for循環:

getUniques([7, 7, 12, 98, 106]) 
    ["start with 7", "7"] 
    ["try 7", "7"] 
    ["try 12", "7,12"] 
    ["try 98", "7,12,98"] 
    ["try 106", "7,12,98,106"] 

RESULT: [7, 12, 98, 106] 
+0

謝謝你進去。我想我應該得到-1這個問題 - 也許這是一個愚蠢的問題? hahah – Seeeyonnn

+0

在if語句中有什麼我可以代替indexO的地方嗎?例如, if(arr [i]!= __________) 有什麼辦法可以說是否(數組元素)不等於(已存在於唯一數組中的任何元素)? – Seeeyonnn

+0

還有其他的東西可以替代,但indexOf將是最簡單的。如果你想包含另一個JavaScript庫,underscore.js有一個包含函數。是否有你想避免indexOf的原因? – damienc88

0
for(var i = 1; i < arr.length; i++) { 
    if (unique.indexOf(arr[i]) == -1) { 
    unique.push(arr[i]); 
    } 
} 

此代碼是通過陣列的長度循環從索引1開始 - 不是0不需要在0啓動,因爲我們可以假設第一項是唯一的

unique.indexOf正在檢查數組元素是否存在於unique數組中。如果IndexOf返回-1,這意味着該元素不存在獨特,所以它push到數組,否則,for循環將遞增到下一個項目的陣列