问题描述
我需要通过以下方式对对象数组进行排序:
第一个应该是收藏夹数组仅包含一项的对象 应该显示第二个对象,其中收藏夹数组未定义或为空 第三收藏夹数组中有超过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));