我有一个这样的对象列表:
[
{"groups":["aaa"]},
{"groups":["bbb"]},
{"groups":["ccc"]},
{"groups":["ddd"]},
{"groups":["eee"]},
{"groups":["fff"]},
{"groups":["ggg"]},
{"groups":["hhh"]},
{"groups":["iii"]},
{"groups":["mmm", "mmm"]}
{"groups":["lll", "lll"]}
];
我想将所有具有多于一个组的对象按字母顺序放在列表的末尾,而将其他一组保持在列表的开头,而不更改原始顺序。
这是我的代码
var list = [
{"groups":["aaa"]},
{"groups":["bbb"]},
{"groups":["ccc"]},
{"groups":["ddd"]},
{"groups":["eee"]},
{"groups":["fff"]},
{"groups":["ggg"]},
{"groups":["hhh"]},
{"groups":["iii"]},
{"groups":["mmm", "mmm"]},
{"groups":["lll", "lll"]}
];
list.sort(function(a, b){
var aIsGroup = (a.groups.length > 1);
var bIsGroup = (b.groups.length > 1);
if (aIsGroup && !bIsGroup) {
return 1;
} else if (!aIsGroup && bIsGroup) {
return -1;
} else if(aIsGroup && bIsGroup){
return a.groups[0].toLowerCase().localeCompare(b.groups[0].toLowerCase());
}
return 0;
});
console.log(list);
您可以在代码段中看到当前输出,但预期输出为:
[
{
"groups": [
"aaa"
]
},
{
"groups": [
"bbb"
]
},
{
"groups": [
"ccc"
]
},
{
"groups": [
"ddd"
]
},
{
"groups": [
"eee"
]
},
{
"groups": [
"fff"
]
},
{
"groups": [
"ggg"
]
},
{
"groups": [
"hhh"
]
},
{
"groups": [
"iii"
]
},
{
"groups": [
"lll",
"lll"
]
},
{
"groups": [
"mmm",
"mmm"
]
}
]
答案 0 :(得分:0)
@deceze在评论中说
JavaScript的排序不能保证稳定的排序。任何“相等”的元素都具有不确定的顺序。有关实现稳定排序的信息,请参见重复项
但是您可以这样做,以使其与原始顺序相同(稳定的排序)
var list = [
{"groups":["aaa"]},
{"groups":["bbb"]},
{"groups":["ccc"]},
{"groups":["mmm", "mmm"]},
{"groups":["ddd"]},
{"groups":["fff"]},
{"groups":["eee"]},
{"groups":["ggg"]},
{"groups":["hhh"]},
{"groups":["iii"]},
{"groups":["lll", "lll"]}
];
list.sort(function(a, b){
var aIsGroup = (a.groups.length > 1);
var bIsGroup = (b.groups.length > 1);
if (aIsGroup && !bIsGroup) {
return 1;
} else if (!aIsGroup && bIsGroup) {
return -1;
} else if(aIsGroup && bIsGroup) {
return a.groups[0].toLowerCase().localeCompare(b.groups[0].toLowerCase());
}
// keep in the same order
return (list.indexOf(a) < list.indexOf(b)) ? -1 : 1;
});
console.log(list);