#javascript #sorting #search
#javascript #сортировка #Поиск
Вопрос:
У меня есть массив объектов, подобных следующему [{город: «Амстердам», страна: «Нидерланды»}, {город: «Норуолк», страна: «Соединенные Штаты»}, {город: «Норуолк», страна: «Соединенные Штаты»}, {город: «Неизвестно», страна: «Неизвестно»}]
Я хочу реализовать поиск с сортировкой по результатам таким образом, чтобы, когда пользователь вводит первый алфавит, например, «n» в поле поиска, он должен отображать результаты в следующем порядке сортировки. А) города, начинающиеся с «n» Б) страны, начинающиеся с «n» В) города, содержащие «n» Г) страны, содержащие «n»
Я попытался реализовать что-то вроде этого
filteredData = gridData.filter(function (rowObj) {
if (!!filterText) {
//Filter records with some function.
return isSubstringIgnoreCase(filterText, rowObj.city) || isSubstringIgnoreCase(filterText, rowObj.country);
}
return true;
});
filteredData.sort(function(a,b) {
var cityA = a.city.toLowerCase(),
cityB = b.city.toLowerCase(),
countryA = a.country.toLowerCase(),
countryB = b.country.toLowerCase();
filterText = filterText.toLowerCase();
if(cityA.indexOf(filterText) < cityB.indexOf(filterText) || cityA.indexOf(filterText) < countryB.indexOf(filterText)) {
return -1;
} else if(cityA.indexOf(filterText) > cityB.indexOf(filterText) || cityA.indexOf(filterText) > countryB.indexOf(filterText)) {
return 1;
} else if(countryA.indexOf(filterText) < countryB.indexOf(filterText) || countryA.indexOf(filterText) < cityB.indexOf(filterText)){
return -1;
} else if(countryA.indexOf(filterText) > countryB.indexOf(filterText) || countryA.indexOf(filterText) > cityB.indexOf(filterText)){
return 1;
} else {
return 0;
}
});
Но это работает не так, как ожидалось. Пожалуйста, помогите мне решить эту проблему.
Ответ №1:
Смотрите мою скрипку: JSFiddle
Я использую:
Array . filter ()
функция для удаления дубликатов из заказов сортировки: A) — C) и B) — D).
Удаленные записи из результатов поиска поступают из заказов: C) и D).