2013-12-10 45 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循环将递增到下一个项目的阵列