#javascript #sorting #arraylist
#javascript #сортировка #arraylist
Вопрос:
У меня есть список случайных городов, как показано ниже. Как я могу сгруппировать и отсортировать его по приведенным ниже критериям
- Функция 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. Отлично.. Большое вам спасибо!!!!!!!!!!!!!!!!!!!!!