javascript如何通过两个规则对对象数组进行排序?

时间:2018-08-30 08:09:02

标签: javascript

我有一个这样的对象列表:

 [
      {"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"
    ]
  }
]

1 个答案:

答案 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);