2015-03-16 2 views
2

У меня есть простой вопрос, и я не уверен, почему содержимое массива не возвращается должным образом. Я почти уверен, что это что-то простое, но почему-то я не получаю желаемых результатов. Сценарий заключается в том, что переменная «compare» устанавливается на значение, например. «apple», и я зацикливаюсь в массиве, и, если яблоко соответствует индексу, напечатайте его в текстовое поле. Он этого не делает, и он всегда говорит «не то же самое» значение. Для знаковой собаки это работает. Похоже, что он достигает последнего массива, а затем выполняет сравнения. Помоги пожалуйста.Цитирование в массиве Javascript

Код ниже

<!DOCTYPE html> 
<html> 
<body> 

<script> 
function myFunction() { 
var text = ""; 
var i; 
var arr = ["apple", "banana", "carrot", "dog"]; 
var compare = "apple"; 

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

    if (arr[i] == compare) {text = "The value is " + arr[i] + "<br>"; } 

    else if (compare == "" || compare == null) { text = "The value is blank"; } 

    else if (arr[i] != compare) {text = "not the same"; } 

else {text ="some error";} 

    } 

    document.getElementById("demo").innerHTML = text; 
} 
</script> 
<p>Click the button to do a loop with a break.</p> 

<button onclick="myFunction()">Try it</button> 


<p id="demo"></p> 

</body> 
</html> 
+0

Он будет работать, если 'apple' был последним элементом массива. Это помогает? – Bergi

+0

Боковое примечание: ваш последний 'else' никогда не будет использоваться, потому что ваши предыдущие условия охватывают все возможности. В частности, у вас есть 'if (arr [i] == compare)' и 'if (arr [i]! = Compare)'. Если вы не сравнили с «NaN» (у которого необычное поведение никогда не было либо '==' или '! =' Ни к чему), одно из этих двух будет истинным. –

ответ

1

function print(msg) { 
 
    document.getElementById("demo").innerHTML += msg + '</br>'; 
 
} 
 

 
function myFunction() { 
 
    var text = ""; 
 
    var i; 
 
    var arr = ["apple", "banana", "carrot", "dog"]; 
 
    var compare = document.getElementById('compare').value; 
 
    if (!compare) { 
 
    print('Compare is empty'); 
 
    return; 
 
    } else { 
 
    print('Comparing with ' + compare); 
 
    } 
 

 
    for (i = 0; i < arr.length; i++) { 
 
    if (arr[i] == compare) { 
 
     print("The value is at index " + i + " is " + arr[i]); 
 
     return; //results found, break out of the for loop 
 
    } else if (arr[i] != compare) { 
 
     print("not the same"); 
 
    } else { 
 
     print("some error"); 
 
    } 
 
    } 
 
    print("Could not find " + compare + " in array"); 
 
}
<!DOCTYPE html> 
 
<html> 
 

 
<body> 
 

 
    <script> 
 
    </script> 
 
    <p>Click the button to do a loop with a break.</p> 
 

 
    <input type="text" id="compare" placeholder="Compare to" /> 
 
    <button onclick="myFunction()">Try it</button> 
 

 

 
    <p id="demo"></p> 
 

 
</body> 
 

 
</html>

Из соображений производительности это лучше, чтобы проверить значение compare перед началом цикла. Вы можете выйти из цикла, используя break, continue или return ключевых слов.

+0

Вы спасатель жизни! Я всегда печатал элемент html, и по какой-то причине цикл сходит с ума. Функция печати была хорошей вспомогательной функцией, которую я бы никогда не использовал! – jeffr

+0

Добро пожаловать. Кроме того, весь алгоритм поиска массива, который вы написали, уже существует в javascript. См. Это: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf – AlexStack

+0

целью моего запроса является упрощение синтаксиса и знакомство с ним. В общем, я собираюсь назвать JSON-файл и пропустить его. Я прочитал документы mozilla, и это помогает, но для моей реализации я хотел, чтобы это было просто. Я очень ценю вашу помощь! :) Я узнал новую вещь сегодня!: D – jeffr

1

Похоже, он достигает последний массив затем делает сравнение. Помоги пожалуйста.

Фактически, да, потому что вы никогда не останавливаете цикл. Таким образом, все предыдущие задания, которые вы сделали с document.getElementById("demo").innerHTML, были перезаписаны последним.

Если вы хотите остановиться, когда найдете совпадение, используйте break, чтобы выйти из цикла.

Если вы хотите, чтобы элемент есть список того, что произошло (я думать может быть то, что вы пытаетесь сделать, это трудно сказать), построить список в text, а затем назначить в конце :

if (compare == "" || compare == null) { 
    // Doesn't make sense to loop in this case, presumably 
    text = "The value is blank"; 
} else { 
    text = ""; 
    for (i = 0; i < arr.length; i++) { 

     if (arr[i] == compare) { 
      text += "The value matches " + arr[i] + "<br>"; 
      // ^--- note the += 
     } else { 
      text += "The value doesn't match " + arr[i] + "<br>"; 
      // ^--- note the += 
     } 
    } 
} 
document.getElementById("demo").innerHTML = text; 
0

Вы никогда не нарушаете петлю for. Вы должны использовать break; для выхода из цикла, когда выполняется условие if.

Здесь ваше ваше решение: http://jsfiddle.net/urahara/rvLyfsto/

и ваш код:

function myFunction() { 
    var text = ""; 
    var i; 
    var arr = ["apple", "banana", "carrot", "dog"]; 
    var compare = "apple"; 

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

     if (arr[i] == compare) { 
      text = "The value is " + arr[i] + "<br>"; 
      break; 
     } else if (compare == "" || compare == null) { 
      text = "The value is blank"; 
      break; 
     } else if (arr[i] != compare) { 
      text = "not the same"; 
      break; 
     } else { 
      text = "some error"; 
      break; 
     } 

    } 

    document.getElementById("demo").innerHTML = text; 
} 

Ура!