Группировка и сортировка Javascript

#javascript #sorting #arraylist

#javascript #сортировка #arraylist

Вопрос:

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

  1. Функция SortAndGroup должна принимать ввод кода страны и сортировать соответственно с городом-столицей в каждой группе на первой позиции, за которой следуют города в этой стране. Спасибо вам за вашу помощь.

    randonCities =

       [
             {
                 "name": "Delhi",
                 "countryCode": "IN",
                 "isCapitol": true
             },
             {
                 "name": "New York",
                 "countryCode": "USA",
                 "isCapitol": false
             },
             {
                 "name": "Birmingham",
                 "countryCode": "UK",
                 "isCapitol": false
             },
             {
                 "name": "London",
                 "countryCode": "UK",
                 "isCapitol": true
             },
             {
                 "name": "Hyderabad",
                 "countryCode": "IN",
                 "isCapitol": false
             },
             {
                 "name": "Chicago",
                 "countryCode": "USA",
                 "isCapitol": false
             },
             {
                 "name": "Bristol",
                 "countryCode": "UK",
                 "isCapitol": false
             },
             {
                 "name": "Washington",
                 "countryCode": "USA",
                 "isCapitol": true
             }
         ]
     

    Конечный результат должен быть

    Сортировка по странам (США, Великобритания, Индиана) =

      [
         {
             "name": "Washington",
             "countryCode": "USA",
             "isCapitol": true
         },
         {
             "name": "Chicago",
             "countryCode": "USA",
             "isCapitol": false
         },
         {
             "name": "New York",
             "countryCode": "USA",
             "isCapitol": false
         },
         {
             "name": "London",
             "countryCode": "UK",
             "isCapitol": true
         },
         {
             "name": "Birmingham",
             "countryCode": "UK",
             "isCapitol": false
         },
         {
             "name": "Bristol",
             "countryCode": "UK",
             "isCapitol": false
         },
         {
             "name": "Delhi",
             "countryCode": "IN",
             "isCapitol": true
         },
         {
             "name": "Hyderabad",
             "countryCode": "IN",
             "isCapitol": false
         } 
     ]
     

Ответ №1:

Вы можете получить порядок из массива (с соответствующими названиями стран) и отсортировать по capitol.

 const
    sortByCountry = (...countries) => (a, b) =>
        countries.indexOf(a.countryCode) - countries.indexOf(b.countryCode) ||
        b.isCapitol - a.isCapitol,
    array = [{ name: "Delhi", countryCode: "IN", isCapitol: true }, { name: "New York", countryCode: "USA", isCapitol: false }, { name: "Birmingham", countryCode: "UK", isCapitol: false }, { name: "London", countryCode: "UK", isCapitol: true }, { name: "Hyderabad", countryCode: "IN", isCapitol: false }, { name: "Chicago", countryCode: "USA", isCapitol: false }, { name: "Bristol", countryCode: "UK", isCapitol: false }, { name: "Washington", countryCode: "USA", isCapitol: true }];

array.sort(sortByCountry('USA', 'UK', 'IN'));

console.log(array); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

ES5

 var sortByCountry = function () {
        var countries = Array.prototype.slice.call(arguments);
        return function (a, b) {
            return countries.indexOf(a.countryCode) - countries.indexOf(b.countryCode) ||
                b.isCapitol - a.isCapitol;
        }
    },
    array = [{ name: "Delhi", countryCode: "IN", isCapitol: true }, { name: "New York", countryCode: "USA", isCapitol: false }, { name: "Birmingham", countryCode: "UK", isCapitol: false }, { name: "London", countryCode: "UK", isCapitol: true }, { name: "Hyderabad", countryCode: "IN", isCapitol: false }, { name: "Chicago", countryCode: "USA", isCapitol: false }, { name: "Bristol", countryCode: "UK", isCapitol: false }, { name: "Washington", countryCode: "USA", isCapitol: true }];

array.sort(sortByCountry('USA', 'UK', 'IN'));

console.log(array); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

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

1. Спасибо, Нина, к сожалению, наш инструмент не совместим с Es6. Можем ли мы добиться того же без оператора распространения?

2. Отлично.. Большое вам спасибо!!!!!!!!!!!!!!!!!!!!!

Ответ №2:

Чтобы отсортировать массив, вы можете использовать:

arr.sort([compareFunction])

Таким образом, вам придется написать пользовательскую функцию compareFunction

Функция compareFunction сравнивает два любых элемента массива и должна возвращать 1, если первый элемент «больше» или -1, если первый элемент «меньше»

arr.sort((a, b) => (a > b) ? 1 : -1)

В этом случае наша функция сортировки может получать любое количество параметров, поэтому мы можем получить к ним доступ в объекте arguments . Мы можем преобразовать объект arguments в массив и использовать функцию indexOf для сравнения позиции кода страны в массиве.

Когда код страны совпадает, мы проверяем, является ли один из элементов capitol .

 randomCities =
  [
         {
             "name": "Delhi",
             "countryCode": "IN",
             "isCapitol": true
         },
         {
             "name": "New York",
             "countryCode": "USA",
             "isCapitol": false
         },
         {
             "name": "Birmingham",
             "countryCode": "UK",
             "isCapitol": false
         },
         {
             "name": "London",
             "countryCode": "UK",
             "isCapitol": true
         },
         {
             "name": "Hyderabad",
             "countryCode": "IN",
             "isCapitol": false
         },
         {
             "name": "Chicago",
             "countryCode": "USA",
             "isCapitol": false
         },
         {
             "name": "Bristol",
             "countryCode": "UK",
             "isCapitol": false
         },
         {
             "name": "Washington",
             "countryCode": "USA",
             "isCapitol": true
         }
     ]

function sortByCountry(){
  var args = Array.from(arguments);
  randomCities.sort( (a, b) => (args.indexOf(a.countryCode) == args.indexOf(b.countryCode)) ? (a.isCapitol ? -1 : 1) : ((args.indexOf(a.countryCode) > args.indexOf(b.countryCode)) ? 1 : -1));
  return randomCities;
}

sortyByCountry('USA', 'UK', 'IN');
 

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

1. Отлично.. Большое вам спасибо!!!!!!!!!!!!!!!!!!!!!

Ответ №3:

Вы могли бы сделать это с помощью Array.prototype.sort() метода и отсортировать код страны, создав массив упорядочения, затем по столице и, наконец, по названию города.

 const sortByCountry = (data, order) =>
  data.sort(
    (x, y) =>
      order.indexOf(x.countryCode) - order.indexOf(y.countryCode) ||
      y.isCapitol - x.isCapitol ||
      x.name.localeCompare(y.name)
  );
const data = [
  {
    name: 'Delhi',
    countryCode: 'IN',
    isCapitol: true,
  },
  {
    name: 'New York',
    countryCode: 'USA',
    isCapitol: false,
  },
  {
    name: 'Birmingham',
    countryCode: 'UK',
    isCapitol: false,
  },
  {
    name: 'London',
    countryCode: 'UK',
    isCapitol: true,
  },
  {
    name: 'Hyderabad',
    countryCode: 'IN',
    isCapitol: false,
  },
  {
    name: 'Chicago',
    countryCode: 'USA',
    isCapitol: false,
  },
  {
    name: 'Bristol',
    countryCode: 'UK',
    isCapitol: false,
  },
  {
    name: 'Washington',
    countryCode: 'USA',
    isCapitol: true,
  },
];
const order = ['IND', 'USA', 'UK'];
console.log(sortByCountry(data, order)); 

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

1. Привет, мистер hr, ваш код работает, но порядок стран является автоматическим порядком убывания и не находится под нашим контролем .. это совпадает с порядком, который я ищу. Другими словами, что, если я хочу, чтобы порядок был IND, USA, UK

2. @HarishPuli Теперь проверьте это. сработало ли это для вас? Пожалуйста, дайте мне знать. Я обновил код.

3. Отлично.. Большое вам спасибо!!!!!!!!!!!!!!!!!!!!!