【发布时间】:2018-08-30 08:09:01
【问题描述】:
我有一个这样的对象列表:
[
{"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);
在sn -p中可以看到当前的输出,但是预期的输出是:
[
{
"groups": [
"aaa"
]
},
{
"groups": [
"bbb"
]
},
{
"groups": [
"ccc"
]
},
{
"groups": [
"ddd"
]
},
{
"groups": [
"eee"
]
},
{
"groups": [
"fff"
]
},
{
"groups": [
"ggg"
]
},
{
"groups": [
"hhh"
]
},
{
"groups": [
"iii"
]
},
{
"groups": [
"lll",
"lll"
]
},
{
"groups": [
"mmm",
"mmm"
]
}
]
【问题讨论】:
-
Javascript 的
sort不保证稳定的排序。任何“相等”的元素都有未定义的顺序。请参阅副本以实现 stable 排序。 -
为什么不先过滤具有多个组的条目,将它们从原始数组中删除,然后附加它们?
-
@connexo 好主意..
-
@connexo 为什么不把这个作为答案
-
将
a.groups.length > 1更改为a.groups.length > 0和b.groups.length > 1更改为b.groups.length > 0
标签: javascript