Как отсортировать массив объектов на 3 части в JS?

#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));