Использование indexOf() в JS — разумно ли отрицать нулевые значения и как?

#javascript

#javascript

Вопрос:

При поиске по массиву, как мы справляемся с пробелами? Говорим ли мы, что поиск возвращает false, если пользователь ничего не вводит (т. Е. Просто нажимает enter) или вводит пробел?

 test_pages=[
"Lorem Ipsum is simply dummy text of the printing and typesetting industry."
, 
"It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout", 
"There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don't look even slightly believable." 
]

var find=prompt("Enter a term");
find = find.toLowerCase();

for(i=0;i<test_pages.length;i  )
    {   
        // normalisation
        test_pages[i] = test_pages[i].toLowerCase();

        // use indexOf() to find the occurrences of pattern
        if(test_pages[i].indexOf(find)>=0)
        {
            alert("true");
            break;
        }
        else if(test_pages[i].indexOf(find)<0)
        {
            alert("false");
        }    
    }
  

Комментарии:

1. Вам это не нужно else if : если indexOf не больше или равно 0, то оно гарантированно будет меньше 0!

Ответ №1:

Это дизайнерское решение, которое вам нужно будет принять; Я не верю, что здесь есть какой-либо «правильный» или «неправильный» ответ. Но чтобы помочь вам проанализировать код, который вы предоставили для рассматриваемых случаев, вам следует рассмотреть:

 "hello".indexOf("h")       => 0
"hello".indexOf("")        => 0
"hello".indexOf(undefined) => -1
"hello".indexOf(null)      => -1
  

Также учтите, что prompt возвращает пустую строку, если оставить ее пустой. Итак, в соответствии с вашим кодом, если пользователь ничего не вводит, ваш код будет предупрежден true .

Ответ №2:

Ну, вы должны проверить ввод и запросить, чтобы пользователь действительно что-то вводил внутри. Если это невозможно, любой ответ логичен и не окажет никакого влияния на пользовательский интерфейс

Ответ №3:

Ваша логика в настоящее время неверна. Если поисковый запрос находится во втором тексте, он предупредит «false», а затем «true»

 var test_pages = [
    "Lorem Ipsum is simply dummy text of the printing and typesetting industry.", 
    "It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout", 
    "There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don't look even slightly believable." 
]

var find = prompt("Enter a term").toLowerCase();

if(find) {
    var found = false;
    for(i = 0; i < test_pages.length; i  ) {           
        // use indexOf() to find the occurrences of pattern
        if(test_pages[i].toLowerCase().indexOf(find) >= 0) {
            found = true;
            break;
        }   
    }
    alert(found ? "true" : "false");
}
else {
    alert("I can't search for that!");
}
  

Ответ №4:

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

Если вы хотите использовать подход «Джинна в волшебной лампе» и буквально давать людям то, что они просят, даже если результат немного озорной, тогда просто верните true, если пользователь ищет символ пробела, а строка имеет его.

Если вы хотите, чтобы алгоритм молча игнорировал пробелы, тогда вы могли бы реализовать что-то подобное в альтернативном варианте:

 test_pages=[
"Lorem Ipsum is simply dummy text of the printing and typesetting industry."
, 
"It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout", 
"There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don't look even slightly believable." 
]

var find=prompt("Enter a term");
find = find.toLowerCase();

// The jQuery operations could be re-written using vanilla JavaScript, 
// if you don't have jQuery available for some reason.
$.each(test_pages, function(index, value) {
    token_array = value.split(" ");
    normalized_array = new Array();
    $.each(token_array, function(index, token) { 
        normalized_array.push(token.toLowerCase()); 
    });

    if( $.inArray( find, normalized_array ) { 
        alert("true");
        break;
    } else {
        alert("false");
    }    
});
  

Этот подход, заключающийся в том, что строковые токены помещаются в массив, а затем проверяется массив, дает вам бесплатно «фильтрацию», которую вы, возможно, ищете. Такие значения, как пустая строка, пробел и т. Д., Не помещаются в массив токенов … поэтому они будут незаметно не найдены.

Другой альтернативой, если вы возвращаете только результат true / false, было бы сохранить имеющуюся у вас реализацию… но перед использованием indexOf функции удалите пробелы.

Ответ №5:

Я думаю, вы можете просто судить, является ли trim(входное сообщение) пустым, если это так, вы можете перейти к методу поиска и вернуть false

 var test_pages = [
    "Lorem Ipsum is simply dummy text of the printing and typesetting industry.", 
    "It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout", 
    "There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don't look even slightly believable." 
]

var find = prompt("Enter a term").toLowerCase(),
    Search = function(str){
        if(str amp;amp; str.trim() != "") {
            for(i = 0; i < test_pages.length; i  ) {           
                if(test_pages[i].toLowerCase().indexOf(str)  > -1) {
                    return true;
                }   
            }
        }
        return false;
    };
Search(find) ? alert("search it") : alert ("no search");