javascript sort函数中的相同项会发生什么

问题描述 投票:1回答:1

我想知道Javascript排序函数对相同项目的作用(例如,排序的是相同项目的顺序是什么?)

示例:如果我有一个对象数组,每个对象都具有以下结构

{
    name:string,
    type:string
}

我想使用sort函数对上面的数组进行排序,以便列表是:

  1. 首先按类型按升序排序(提供特定的排序功能)
  2. 具有相同类型的项目将按名称按升序排序

例:

排序前:

[{name:"John", type:"type3"},{name:"Tim", type:"type2"},{name:"Buck", type: "type2"},{name:"Emma", type:"type2"}]

排序后:

[{name:"Buck", type:"type2"},{name:"Emma", type:"type2"},{name:"Tim", type:"type2"},{name:"John", type:"type3"}]

我提出的解决方案似乎有效(基于特定结果)是:

  1. 按名称排序整个列表(因为排序函数使用就地算法,原始列表将在此后按名称排序)
  2. 按类型对整个列表进行排序

这意味着sort函数似乎保持了相等项的原始顺序(例如,第二种排序以原始顺序放置具有相同“type2”的项目,这是按名称排序的列表的顺序)

但我找不到文件来支持我的这个理论。

我的问题是:对于所有情况和不同的浏览器,这种行为(sort函数保留了相同项的原始顺序)是真的吗?

我会很感激任何证实这种行为的文件。

javascript arrays sorting
1个回答
2
投票

要按两个键排序,您只需要通过.sort()一次。在比较功能中,您只需要在主键相同时比较辅助键:

yourArray.sort(function(o1, o2) {
  var c = o1.type.localeCompare(o2.type);
  if (c) return c;
  return o1.name.localeCompare(o2.name);
});

如果类型的比较(通过.localeCompare())返回1或-1,则返回以用于对对象进行排序。如果类型相等,则比较将移至名称。

© www.soinside.com 2019 - 2024. All rights reserved.