2017-02-20 5 views
0

У меня есть простой массив, содержащий голландский город имена:Поиск в массиве, а не только уникальные значения

var cities = ['Amsterdam', 'Den Haag', 'Den Helder', 'Rotterdam', 'Utrecht', 'Groningen', 'Zoetermeer', 'Zwolle', 'Delft']; 

Мой код для поиска в массиве выглядит следующим образом:

elems.searchField.on('keyup', function(e) { 
    var index, city, result; 
    var currentCity = elems.searchField.val().toLowerCase(); 
    for (index = 0; index < cities.length; ++index) { 
     city = cities[index].toLowerCase(); 

     if (city.indexOf(currentCity) > -1) { 
      result = city; 
      console.log(result); 
      break; 
     } 
    } 
}); 

elems.optionsButton.on('click', function(e) { 
    if (optionButtonState === 0) { 
     elems.consoleItemSecondAndThird.css('display', 'flex'); 
     optionButtonState = 1; 
    } else { 
     elems.consoleItemSecondAndThird.hide(); 
     optionButtonState = 0; 
    } 
}); 

Вы можете увидеть два города, которые начинаются с «Ден», это «Ден Хааг» и «Де Хелдер». Когда я набираю «Den», мне нужно увидеть их обоих, однако мой код только ищет уникальные значения и показывает только «Den Haag», когда «Den» вставлен, например. Как я могу отобразить все значения, содержащие поисковый запрос?

+0

Вы получаете только один результат, потому что ваш «результат» переменная дает только один город. Вместо этого вы можете использовать его как массив и продолжить цикл for. например 'result.push (город); continue; ' – getjackx

ответ

4

Вы можете использовать filter(), чтобы получить массив и внутри фильтра. startsWith() функция. Но следует помнить, что startsWith в ES6

StartsWith

var cities = ['Amsterdam', 'Den Haag', 'Den Helder', 'Rotterdam', 'Utrecht', 'Groningen', 'Zoetermeer', 'Zwolle', 'Delft']; 
 

 
console.log(cities.filter(item => item.startsWith('Den')));

Для совместимости со старыми версиями браузеров, которые можно использовать indexOf() функцию для сравнения index.

var cities = ['Amsterdam', 'Den Haag', 'Den Helder', 'Rotterdam', 'Utrecht', 'Groningen', 'Zoetermeer', 'Zwolle', 'Delft']; 
 

 
console.log(cities.filter(item => item.indexOf('Den') === 0));

0

Используйте StartsWith и фильтр; Вы можете LOWERCASE значения там тоже:

elems.searchField.on('keyup', function(e) { 
    return cities.filter(v => v.toLowerCase().startsWith(this.value.toLowerCase()) 
} 
0

использование item.contain("Den")

так это даст вам любой предмет, в котором он находит «DEN» или вы можете использовать item.startswith("Den") указать только те элементы, которые запускаются с «ден»

0

Вы можете сделать это также с помощью RegExp.

var cities = ['Amsterdam', 'Ajax', 'Den Haag', 'Den Helder', 'Denmark', 'Rotterdam', 'Utrecht', 'Groningen', 'Zoetermeer', 'Zwolle', 'Delft']; 
 

 
function check(arr, query) { 
 
    console.log(cities.filter(v => v.match(new RegExp('^' + query, 'g')))); 
 
} 
 

 
check(cities, 'Den'); 
 
check(cities, 'A');

+0

@erol_smsr Рассмотрите возможность опроса? (: –