如何在 JS 中将 objects 的数组分成 3 个部分进行排序?

How to sort array of objects in 3 parts in JS?

我需要按以下方式对 objects 的数组进行排序:

第一个应该是 objects,其中收藏夹数组仅包含一项 第二个应该显示 objects,其中收藏夹数组未定义或为空 第 3 个收藏夹数组有超过 1 个项目

objects 的总数组如下所示:

[
{
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));

如何按照上面的解释将 objects 的数组分为 3 个部分进行排序?

这不是排序,它是对不同的元素进行分组。

使用 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 result;
    });
}

您可以为每个案例分配一个编号,应该先排在前面的案例的编号较小,然后在比较时将两者相减。

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