Реализовать сортировку по нескольким полям в результатах поиска в javascript

#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).