#javascript #arrays #sorting
#javascript #массивы #сортировка
Вопрос:
Я пытаюсь создать функцию, которая сортирует массив на основе значения вложенного объекта.
const customers = [
{
name: 'John',
displayOrder: [{ route1: 1 }, { route2: 3 }],
},
{
name: 'Julie',
displayOrder: [{ route1: 2 }, { route2: 1 }],
},
{
name: 'Betsy',
displayOrder: [{ route1: 3 }, { route2: 2 }],
},
];
function sortCustomers(customers, route) {
//enter amazing code here :P
//here is what I think could work, just don't know how to get the index number
customers.sort((a, b) => (a.displayOrder[?].route > b.displayOrder[?].route ? 1 : -1))
}
const route = 'route2';
sortCustomers(customers, route);
//desired output: [{Julie}, {Betsy}, {John}]
Я хочу использовать array.sort, но я не знаю, как динамически генерировать индекс для соответствующего переданного аргумента маршрута.
Комментарии:
1. Привет @beadle, обычно люди прямо не спрашивают о реализациях здесь, в stackoverflow. Опубликуйте свой собственный подход к решению, и тогда мы, возможно, посмотрим, в чем заключается конкретная проблема или как ее можно улучшить.
2. Привет, @Benjamin, спасибо, что дал мне знать!
Ответ №1:
Вы можете найти порядок и принять его как значение для сортировки.
function sortCustomers(customers, route) {
const order = ({ displayOrder }) => displayOrder.find(o => route in o)[route];
customers.sort((a, b) => order(a) - order(b));
return customers;
}
const customers = [{ name: 'John', displayOrder: [{ route1: 1 }, { route2: 3 }] }, { name: 'Julie', displayOrder: [{ route1: 2 }, { route2: 1 }] }, { name: 'Betsy', displayOrder: [{ route1: 3 }, { route2: 2 }] }];
console.log(sortCustomers(customers, 'route2'));
.as-console-wrapper { max-height: 100% !important; top: 0; }
Ответ №2:
const customers = [
{
name: 'John',
displayOrder: [{ route1: 1 }, { route2: 3 }],
},
{
name: 'Julie',
displayOrder: [{ route1: 2 }, { route2: 1 }],
},
{
name: 'Betsy',
displayOrder: [{ route1: 3 }, { route2: 2 }],
},
];
function sortCustomers(customers, route) {
const index = route == "route2" ? 1 : 0;
let sorted = customers.sort((a, b) => {
return a.displayOrder[index][route] - b.displayOrder[index][route]
})
// only listed name obj
const result = sorted.map(obj => obj.name);
return resu<
}
const route = 'route2';
const result = sortCustomers(customers, route);
console.log(result)