Сортировка массива по значением
У меня есть вот такой массив
const usersTable = [
{
id: 516;
info: [
{
data: "Viktor";
type: "name";
},
{
data: "Pavlov";
type: "surname";
}
];
},
{
id: 254;
info: [
{
data: "Alexey";
type: "name";
},
{
data: "Romanov";
type: "surname";
}
];
},
]
И мне нужно сортировать этот массив по type, то есть мне нужно проверять сортировка по name или surname
Я попытался как то вот так это решить, но у меня не получилось.
const sortArray = usersTable.sort((a, b) => {
const findIndex = (arr) =>
arr.info.findIndex((item) => item.type === "surname");
const x = a.info[findIndex(a)];
const y = b.info[findIndex(b)];
return x.data > y.data ? 1 : -1;
});
console.log(sortArray);
Буду рад хоть какому то ответу
Ответы (3 шт):
Автор решения: Newb13
→ Ссылка
Я тут как то разобрался, но что то не понял почему мой прошлый метод не работал.
Раз работает, то я не буду трогать :)
Часть кода подстмотрел здесь и кто то уже задавал схожий запрос
// От sortTable: {
// sortType: "asc" | "desc" | "",
// sortBy: "name" | "surname"
// }
const compare = (a, b) => {
const x = a.info[a.info.findIndex((i) => i.type === sortTable.sortBy)].data;
const y = b.info[b.info.findIndex((i) => i.type === sortTable.sortBy)].data;
if (sortTable.sortType === "asc") {
// У меня тут ещё сортировка по названию. Тут отображается от А до Я
return x > y ? 1 : -1;
} else if (sortTable.sortType === "desc") {
// Тут отображается от Я до А
return x < y ? 1 : -1;
} else {
// Тут всё по дефолту
return 0;
}
}
Автор решения: Evgenii
→ Ссылка
Простите, что пишу еще одним ответом, но в комментариях это было-бы очень громоздко. Ваш ответ можно сократить:
const compare = (a, b) => {
const x = a.info[a.info.findIndex((i) => i.type === sortTable.sortBy)].data;
const y = b.info[b.info.findIndex((i) => i.type === sortTable.sortBy)].data;
if (x > y) {
return 1;
}
if (x < y) {
return -1;
}
return 0;
}
Автор решения: EzioMercer
→ Ссылка
Это вариант, если разрешено хранить пользователей в другом формате:
const usersTable = [{
id: 516,
info: {
name: 'Viktor',
surname: 'Pavlov'
}
},
{
id: 254,
info: {
name: 'Alexey',
surname: 'Romanov'
}
}
]
const sortUsersByParam = (sortParam) => {
return usersTable.sort((a, b) => {
const first = a.info[sortParam];
const second = b.info[sortParam];
if (first > second) return 1;
if (first < second) return -1;
if (first === second) return 0;
})
}
console.log('Sorting by name\n', sortUsersByParam('name'));
console.log('Sorting by surname\n', sortUsersByParam('surname'));