我正在尝试使用Array.prototype.sort()
方法对数组或对象进行重新排序。
我的对象数组可能看起来像(我从现实生活场景中删除了不相关的属性):
[
{
context: [
{ value: 'hover' }
]
},
{
context: []
},
{
context: [
{ value: 'active' }
]
},
{
context: [
{ value: 'large' }
]
}
]
我需要根据context
属性的嵌套对象中包含的值对对象重新排序。
条件是:
hover
值,则移至数组的末尾因此,上述4个对象的数组应从[1, 2, 3, 4]
到[2, 3, 4, 1]
我可以满足第一个条件,例如:
rules.sort((a, b) => {
return (a.context.length - b.context.length);
});
...这根据上下文对象的数量(因此满足第一个条件)对数组重新排序,但是我不知道如何满足第二个条件。
我能够确定a
或b
数组是否包含一个具有hover
值的上下文对象,这似乎是一个不错的开始,但是我不确定在哪里从这里去...
rules.sort((a, b) => {
const AIsHover = a.context.some(c => c.value === 'hover');
const BIsHover = b.context.some(c => c.value === 'hover');
return (a.context.length - b.context.length);
});
任何帮助将不胜感激!谢谢
答案 0 :(得分:1)
您只需区分案例即可实现:
rules.sort((a, b) => {
if (!a.context.length && !b.context.length) {
return 0;
}
if (a.context.length && !b.context.length) {
return 1;
}
if (!a.context.length && b.context.length) {
return -1;
}
if (a.context.some(c => c.value === 'hover') && b.context.some(c => c.value === 'hover')) {
return 0;
}
if (a.context.some(c => c.value === 'hover')) {
return 1;
}
if (b.context.some(c => c.value === 'hover')) {
return -1;
}
return 0;
});