2

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

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

编辑:我现在明白为什么这是有效的,因为它只是连接然后比较字符串。我认为意图不是很清楚,所以我可能会写一些不那么骇人听闻的东西。

此外,我并不是简单地询问您是否可以创建自定义排序函数,您可以在文档中轻松找到该函数。我在问我在这种特殊情况下的做法是否有效。

4

5 回答 5

3

你可以。

  • MDN 文档(通常是对开发人员最友好的在线参考)
  • ECMA 标准(第 15.4.4.11 节)(官方标准)
于 2012-08-08T14:41:57.187 回答
2

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

这里发生了什么?

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

因此,在您的示例中,您将a.namea.companyb.name与连接b.company并比较此连接:

"nameA,companyA" > "nameB,companyB"

问题是什么?

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

例如:

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

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


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

于 2012-08-08T15:01:25.727 回答
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 可以评估数组的值作为结果。

于 2012-08-08T14:45:17.370 回答
0

是的,它是有效的。这是 MDN文档

于 2012-08-08T14:43:01.383 回答
0

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

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

于 2012-08-08T14:43:36.030 回答