2013-12-10 2 views
0

Я работаю над вызовом coderbyte под названием SecondGreatLow. Нам присваивается массив чисел в качестве параметра и предполагается, что он будет возвращать второй самый низкий # и второй наивысший # из данного массива.Javascript: Сложность анализа кода, содержащего indexOf в цикле for

Я использую чей-то код - я анализирую/реконструирую его, но меня смущает одна часть. Вот код:

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.

Из чтения ч/б строк и глядя на нижнюю половину кода, я считаю, что первая верхняя половина кода избавляется от всех значений повторения? - Все оставшиеся не повторяющиеся значения попадают в уникальный массив, где мы получаем 2-й самый низкий (уникальный [1]) и второй по высоте (уникальный [1] по обратному массиву).

Но что делает это утверждение if-do ???

Я знаю, что если indexOf == -1, то это означает, что поиск определенного элемента не найден.

Но если мы идем через это шаг за шагом ...

var unique = [arr[0]]; 

^Это берет значение 1-го элемента в заданном массиве/параметра и сохранения его в массиве с именем «уникальный»

Тогда есть для цикла, который начинается с индексом 1 (а не 0)

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

^Таким образом, цикл выполняется через исходный массив, который был предоставлен в качестве параметра (а не через й уникальный массив). Но это, где я получаю confused-

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

Итак, давайте говорить, что мы собираемся через 1 итерации для петли и я = 1 ... Мы хотим, чтобы найти индекс обр [1], который будет вторым значением массива. НО КОТОРАЯ МАССА? Метод indexOf запускается на «уникальном», так что мы находим индекс второго значения уникального массива (который в настоящее время имеет только (arr [0])? Или мы находим индекс второго значения массив, который был передан как параметр?

В первом массиве нет 1-го элемента/значения в 1-м прогоне через цикл for (так как есть только 1 значение), поэтому мы будем толкать этот элемент/добавление что элемент уникального массива.

в принципе, я запутался, что верхняя половина коды на самом деле делает. Любая помощь будет оценена.

Если вы хотите использовать пример, я думаю, , предположим, что массив [7, 7, 12, 98, 106] передан как параметр ...

Спасибо заранее ...

ответ

1

Если уникальный массив не содержит соответствующее значение обр [я], добавьте его в уникальный массив.

Причина, по которой цикл начинается с i = 1, заключается в том, что arr [0] уже сохранен в уникальном виде. Мы повторяем arr и проверяем уникальность и добавляем уникальность, если значение не существует.

Что касается вашего примера, я взял фрагмент и добавил некоторые записи в него. Таковы результаты после каждого прохода для петли:

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

Есть ли что-нибудь, что я могу заменить вместо indexOf в инструкции if? Например, if (arr [i]! = __________) есть ли способ сказать, если (элемент массива) не равен (любой элемент, который уже находится в уникальном массиве) ??? – Seeeyonnn

+0

Есть и другие вещи, которые вы можете заменить, но indexOf будет самым простым. Если вы хотите включить другую библиотеку javascript, функция underscore.js имеет функцию contains. Есть ли причина, по которой вы хотите избежать 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 будет увеличиваться до следующего элемента в массиве

Смежные вопросы