这种通过多个属性排序对象数组的方式有多可靠?

时间:2012-08-08 14:40:23

标签: javascript

我需要对一个对象文字数组进行排序,我需要比较对象的两个属性。我在网上找到了一个如何做的例子,但我在规范中找不到任何支持文档。任何人都可以确认您可以在Javascript中执行以下操作,并可能指向我一些文档:

users.sort(function(a, b){ 
    return [a.name, a.company] > [b.name, b.company] ? 1:-1; 
});

编辑:我现在明白为什么这是有效的,这是因为它只是连接然后比较字符串。我不认为意图非常明确,所以我可能会写一些不太苛刻的东西。

另外,我不是简单地询问您是否可以创建自定义排序功能,您可以在文档中轻松找到它。我在问这个特殊情况下我这样做的方式是否有效。

5 个答案:

答案 0 :(得分:3)

你可以。

答案 1 :(得分:2)

正如我在评论中已经解释的那样,是的,你可以这样做。

这里发生了什么?

无论何时在比较中使用数组,数组都会转换为字符串表示形式,它只是一个以逗号分隔的元素列表。 JavaScript 分别比较数组的每个元素。

因此,在您的示例中,您将a.namea.companyb.nameb.company连接在一起并比较此连接:

"nameA,companyA" > "nameB,companyB"

有什么问题?

如果这些值中的任何一个是数字(不是字符串),您将遇到问题,因为数字的词典顺序与数字顺序不同。

例如:

> ['a', 100] > ['a', 11]
  false

您最终将'a,100''a,11'进行比较,并且由于0位于1之前,因此第一个字符串小于第二个字符串。


底线是:如果您知道自己只处理字符串值,那么您可能会很好,尽管隐式连接可能难以理解。
一旦你有混合数据类型,你真的应该单独比较这些值。

答案 2 :(得分:1)

sort功能而言,您可以参考Mozilla Developer Network作为参考。

参考https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/sort

它基本上允许您定义可以实现sort的回调函数。为什么这种排序功能特别有效?试试这个简化的例子:

foo = [1, 2]
[1, 2]
bar = [3, 4]
[3, 4]
foo > bar
>> false
bar > foo
>> true

通过比较数组的字符串表示形式,Javascript可能会评估数组的值。

答案 3 :(得分:0)

是的,这是有效的。 这是MDN Documentation

答案 4 :(得分:0)

当然,Array.sort是一个带有cmp参数的函数,它本身就是一个需要两个参数进行比较的函数:

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/sort