Javascript 排序功能。按第一个然后按第二个排序

IT技术 javascript arrays sorting
2021-01-27 06:28:03

我有一组要排序的对象。每个对象有两个参数:强度和名称

objects = []
object[0] = {strength: 3, name: "Leo"}
object[1] = {strength: 3, name: "Mike"}

我想先按强度排序,然后按字母顺序排序。我正在使用以下代码按第一个参数进行排序。我如何按秒排序?

function sortF(ob1,ob2) {
  if (ob1.strength > ob2.strength) {return 1}
  else if (ob1.strength < ob2.strength){return -1}
  return 0;
};

谢谢你的帮助。

(我使用Array.sort()和前面提到的 sortF 作为传递给它的排序比较函数。)

6个回答

将您的排序功能扩展为这样;

function sortF(ob1,ob2) {
    if (ob1.strength > ob2.strength) {
        return 1;
    } else if (ob1.strength < ob2.strength) { 
        return -1;
    }

    // Else go to the 2nd item
    if (ob1.name < ob2.name) { 
        return -1;
    } else if (ob1.name > ob2.name) {
        return 1
    } else { // nothing to split them
        return 0;
    }
}

A <and>对字符串的比较字母比较。

当按多个键排序时,这个小功能通常很方便:

cmp = function(a, b) {
    if (a > b) return +1;
    if (a < b) return -1;
    return 0;
}

或者,更简洁地说,

cmp = (a, b) => (a > b) - (a < b)

之所以有效,是因为在 javascript 中:

true - true // gives 0
false - false // gives 0
true - false // gives 1
false - true // gives -1

像这样应用它:

array.sort(function(a, b) { 
    return cmp(a.strength,b.strength) || cmp(a.name,b.name)
})

Javascript 确实缺少 Ruby 的spaceship operator,这使得这种比较非常优雅。

@AndyB:从那时起它就被修复了;)
2021-03-13 06:28:03
谢谢你。我一直在寻找这个知识核心一段时间......我只是不知道如何措辞。尤其是飞船操作员。
2021-03-16 06:28:03
@AndySmith:当然,cmp(a, b) || cmp(c, d) || cmp(e, f)等等
2021-03-17 06:28:03
Perl 的飞船操作员。
2021-04-06 06:28:03
喜欢这个,已实现到应用程序中。这也适用于 3 个键吗?我还没有到那里,但可能需要进行第三次排序。
2021-04-09 06:28:03

您可以使用逻辑 OR 链接排序顺序。

objects.sort(function (a, b) {
    return a.strength - b.strength || a.name.localeCompare(b.name);
});
奇迹般有效 return a.z - b.z || a.x - b.x || a.y - b.y
2021-03-14 06:28:03
也许是这样的: return ((a.strength || Number.MAX_VALUE) - (b.strength || Number.MAX_VALUE)) || a.name.localeCompare(b.name);
2021-03-17 06:28:03
太精彩了!但是如果强度可以未定义,并且我们希望所有具有定义强度的对象先行呢?有没有像这样优雅的解决方案?
2021-03-29 06:28:03
是的,您可以为不存在的部分添加默认值,例如return ((a.strength || Infinity) - (b.strength || Infinity)) || a.name.localeCompare(b.name);. 但这取决于 的可能值strength
2021-04-11 06:28:03

当我正在寻找这个问题的答案时,我在 StackOverflow 上找到的答案并不是我真正希望的。所以我创建了一个简单的、可重用的函数来完成这个任务。它允许您使用标准Array.sort,但具有firstBy().thenBy().thenBy()风格。 https://github.com/Teun/thenBy.js

附注。这是我第二次发这个。第一次被版主删除,“请不要为自己的工作做宣传”。我不确定这里的规则是什么,但我试图回答这个问题。我很抱歉这是我自己的工作。随意再次删除,但请指出当时涉及的规则。

是的,很好,我想。显示字段的真正任意组合很诱人,但自述文件确实应该从最常见的经过处理的场景开始。谢谢你的提示。
2021-03-19 06:28:03
你应该在 Readme.md 中放一个名字,姓氏示例,因为每个人都在 ^^,我会试试这个库,看起来不错。
2021-03-26 06:28:03
我不能代表这些模组,但除了自我宣传之外,我猜测他们为什么删除它:仅链接的答案不包含答案将 40 行库源代码复制到您的答案中可能也不理想,但复制几行代码或描述库中实现的算法会使您的答案的内容独立存在。
2021-03-29 06:28:03
这很棒。我不明白为什么版主会删除如此有用的东西。如果它需要购买,那么情况可能会有所不同,不过,我想这取决于我们来决定。我们都在这里长大,可以做出明智的决定。
2021-03-30 06:28:03

史蒂夫的回答,但更漂亮。

objects.sort(function(a,b)
{
  if(a.strength > b.strength) {return  1;}
  if(a.strength < b.strength) {return -1;}
  if(a.name     > b.name    ) {return  1;}
  if(a.name     < b.name    ) {return -1;}
  return 0;
}