Javascript:难以分析在for循环中包含indexOf的代码

时间:2013-12-10 03:43:54

标签: javascript for-loop indexof

我正致力于题为SecondGreatLow的coderbyte挑战。我们得到一个数字数组作为参数,并且应该返回给定数组的第二低#和第二高#。

我正在使用别人的代码 - 我正在分析/逆向工程,但我在一方面感到困惑。这是代码:

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语句。

通过阅读b / w行和查看代码的下半部分,我相信代码的第一个上半部分是摆脱所有重复值? - 所有剩余的非重复值都会弹出到唯一数组中,然后我们得到第二低(唯一[1])和第二高(反转数组中唯一[1])值。

但if-statement做什么???

我知道如果indexOf == -1,那么这意味着找不到找到的特定项目。

但是,如果我们一步一步地去......

var unique = [arr[0]];

^这是取给定数组/参数中第一个元素的值并将其存储在名为“unique”的数组中

然后有一个从索引1开始的for循环(而不是0)

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

^因此,for循环正在运行作为参数提供的原始数组(而不是通过唯一数组)。但这是我感到困惑的地方 -

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

所以我们假设我们要通过for循环的第一次迭代并且i = 1 ...我们想要找到arr [1]的索引,这将是数组的第二个值。但是哪个阵列? indexOf方法正在“唯一”运行,所以我们找到唯一数组的第二个值的索引(目前只有(arr [0])???或者我们找到第二个值的索引作为参数传入的数组?

第一次运行的唯一数组中没有第二个元素/值通过for循环(因为只有1个值),所以我们将推送该元素/将该元素添加到唯一数组中。

基本上,我很困惑代码的上半部分实际上在做什么。任何帮助,将不胜感激。

如果你想使用一个例子,我想,假设数组[7,7,12,98,106]作为参数传递......

提前致谢...

2 个答案:

答案 0 :(得分: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]

答案 1 :(得分: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循环将递增到数组中的下一个项