如何在JS中将对象数组分为3个部分?

问题描述

我需要通过以下方式对对象数组进行排序:

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

对象的总数组如下所示:

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

在这里找到了类似的解决方案,但是这种排序不适用于上述情况:

$(function(){
  const Ps = new PerfectScrollbar();
  $(".button-collapse").sideNav();
  var sideNavScrollbar = document.querySelector('.custom-scrollbar');
  Ps.initialize(sideNavScrollbar);  
})

如何按照上面的说明将对象数组分为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));