#javascript #arrays #ecmascript-6 #javascript-objects #ecmascript-5
#javascript #массивы #ecmascript-6 #javascript-объекты #ecmascript-5
Вопрос:
Мне нужно отсортировать массив объектов следующим образом:
1-м должны быть объекты, в которых массив избранного содержит только один элемент 2-м должны быть показаны объекты, в которых массив избранного не определен или пуст 3-й массив избранного содержит более 1 элемента
Общий массив объектов выглядит следующим образом:
[
{
rentalName:
rentalAdress:
favorites:[]
...
}
]
Я нашел аналогичное решение здесь, но эта сортировка не будет работать в приведенном выше случае:
function sortBy(selector) {
const cmp = (a, b) => (selector(a) - selector(b));
return list => list.sort(cmp);
}
const data = [{ rentalName: "Foo", favorites:[{}, {}, {}] }, { rentalName: "Bar", favorites:[{}] }, { rentalName: "Baz", favoriteslikes:[{}] }, { Name: "Plugh", favorites:[] }];
const sortByLikes = sortBy(({ favorites }) => favorites.length);
console.log(sortByLikes(data));
Как отсортировать массив объектов по 3 частям, как было объяснено выше?
Комментарии:
1. Сортировка означает размещение массива в определенном порядке. Я думаю, вы на самом деле спрашиваете о фильтрации.
Ответ №1:
Это не сортировка, это создание разных групп элементов.
Используйте forEach
цикл и помещайте объект в другой массив в зависимости от условия.
function groupByFavorites(array) {
let result = {
none: [],
one: [],
multiple: []
};
array.forEach(o => {
if (!o.favorites) { // undefined or empty
result.none.push(o);
} else if (o.favorites.length == 1) {
result.one.push(o);
} else {
result.multiple.push(o);
}
return resu<
});
}
Комментарии:
1. Это не работает, показывает ошибку в строке возврата, похоже, синтаксическая ошибка, но не уверен, почему.
2. Я думаю, что я это исправил.
Ответ №2:
Вы можете присвоить номер каждому обращению, причем обращения, которые должны идти первыми, имеют меньшие номера, а затем вычесть два при сравнении.
function sortBy() {
const getOrder = ({favorites})=>favorites?.length === 1 ? 0 : !favorites?.length ? 1 : 2;
const cmp = (a, b) => (getOrder(a) - getOrder(b));
return list => list.sort(cmp);
}
const data = [{ rentalName: "Foo", favorites:[{}, {}, {}] }, { rentalName: "Bar", favorites:[{}] }, { rentalName: "Baz", favoriteslikes:[{}] }, { Name: "Plugh", favorites:[] }];
const sortByLikes = sortBy();
console.log(sortByLikes(data));