У нас есть массив с данными, и я хочу отсортировать его по ключу users
:
Если users
имеет 1 объект, я сортирую его по свойству name
.
Если users
имеет более одной записи, я сортирую по users.length
.
Пример:
DESCENDING: Zorya, Gorya, Dorya, Borya, Aorya, 4, 2, 0
ASCENDING: Aorya, Borya, Dorya, Gorya, Zorya, 2, 4, 0
Вот что я сделал до сих пор:
const array = [{
name: "qw",
users: [
{ name: "Borya" },
],
}, {
name: "qw",
users: [
{ name: "Gorya" },
],
}, {
name: "qw",
users: [
{ name: "Zorya" },
]
}, {
name: "qw",
users: [
{ name: "Var" },
{ name: "Var2" },
],
}, {
name: "qw",
users: [],
}, {
name: "qw",
users: [
{ name: "Aorya" },
],
}, {
name: "qw",
users: [
{ name: "rwerwerwe" },
{ name: "tregdf" },
{ name: "gdfgdf" },
{ name: "Vayetrtertrr2" },
]
}, {
name: "qw",
users: [
{ name: "Dorya" },
],
}];
function orderCustomBy(collection, key, direction) {
const direct = direction === "desc" ? -1 : 1;
let compare = (a, b) => {
if (a === null) return -1;
if (b === null) return 1;
// Just commenting this out because there's no `intlCollator` in here:
// return intlCollator.compare(a, b);
};
if (key === "users") {
compare = (a, b) => {
// What should go in here?
// intlCollator.compare(a[0].name, b[0].name);
return 1;
};
}
return [].concat(collection).sort((a, b) => {
const result = compare(a[key], b[key]);
return result * direct;
});
}
console.log(orderCustomBy(array, 'users', 'asc')
.map(item => item.users.length === 1 ? item.users[0].name : item.users.length));
console.log(orderCustomBy(array, 'users', 'desc')
.map(item => item.users.length === 1 ? item.users[0].name : item.users.length));
.as-console-wrapper {
max-height: 100% !important;
}