对Array的对象按特定的键值排序



我有对象数据数组,我想通过特定键来排序数组的对象,即default。在路由数组中。它有某个路径对象。我只想根据default键来排序。如果键default:true在对象中,那么这个对象将会到顶部,如果default:true在多个对象中被发现,那么总是设置在找到default:true键的第一个对象的顶部。同样,如果我们在子目录中找到了default:true键:[]然后是它的父对象这个对象会到顶部。所以,请建议解决这个问题的方法。

输入数据:

[
{
"id": 1,
"title": 'Dashboard',
"subrr": [
{
"id": 2,
"title": 'Test'
]
},
{
"id": 3,
"title": 'Card',
"default": true,
"subrr": [
{
"id": 4,
"title": 'notification'
}
],
},
{
"id": 5,
"title": 'User',
"subrr": [
{
"id": 6,
"title": 'sample'
},
{
"id": 7,
"title": 'chart',
"default": true
}
]
},
];

/**************/

输出数据:

[
{
"id": 5,
"title": 'User',
"subrr": [
,
{
"id": 7,
"title": 'chart',
"default": true
},
{
"id": 6,
"title": 'sample'
}
]
},
,
{
"id": 3,
"title": 'Card',
"default": true,
"subrr": [
{
"id": 4,
"title": 'notification'
}
],
},
{
"id": 1,
"title": 'Dashboard',
"subrr": [
{
"id": 2,
"title": 'Test'
]
}
];

我是如何理解你的排序要求的:

  1. element.subarr[i].default属性排序
  2. element.default属性排序

为要排序的每个条件创建比较器函数。

const byDefault = (a, b) => (a.default === b.default ? 0 : a.default ? -1 : 1);
const bySubArrDefault = (a, b) => {
const resA = a.subarr.some((el) => el.default);
const resB = b.subarr.some((el) => el.default);
if (resA === resB) return 0;
return resA && !resB ? -1 : 1;
};

现在要按多个条件排序,本质上是排序和分组,每个组被排序,然后每个子组被排序。分组/排序是通过将所有比较器函数与逻辑OR (||)组合来实现的。此逻辑尝试查找并返回第一个非零比较器函数结果。

data.sort((a, b) => bySubArrDefault(a, b) || byDefault(a, b))

按子数组元素default属性对所有数据元素排序,然后在该组中按根数组default属性排序。

const data = [
{
id: 1,
title: "Dashboard",
subarr: [
{
id: 2,
title: "Test"
}
]
},
{
id: 3,
title: "Card",
default: true,
subarr: [
{
id: 4,
title: "notification"
}
]
},
{
id: 5,
title: "User",
subarr: [
{
id: 6,
title: "sample"
},
{
id: 7,
title: "chart",
default: true
}
]
}
];
const byDefault = (a, b) => (a.default === b.default ? 0 : a.default ? -1 : 1);
const bySubArrDefault = (a, b) => {
const resA = a.subarr.some((el) => el.default);
const resB = b.subarr.some((el) => el.default);
if (resA === resB) return 0;
return resA && !resB ? -1 : 1;
};
const sorted = data
.slice(0)
.sort((a, b) => bySubArrDefault(a, b) || byDefault(a, b));
console.log(sorted);

最新更新