我需要对一个对象文字数组进行排序,我需要比较对象的两个属性。我在网上找到了一个如何做的例子,但我在规范中找不到任何支持文档。任何人都可以确认您可以在Javascript中执行以下操作,并可能指向我一些文档:
users.sort(function(a, b){
return [a.name, a.company] > [b.name, b.company] ? 1:-1;
});
编辑:我现在明白为什么这是有效的,这是因为它只是连接然后比较字符串。我不认为意图非常明确,所以我可能会写一些不太苛刻的东西。
另外,我不是简单地询问您是否可以创建自定义排序功能,您可以在文档中轻松找到它。我在问这个特殊情况下我这样做的方式是否有效。
答案 0 :(得分:3)
你可以。
答案 1 :(得分:2)
正如我在评论中已经解释的那样,是的,你可以这样做。
这里发生了什么?
无论何时在比较中使用数组,数组都会转换为字符串表示形式,它只是一个以逗号分隔的元素列表。 JavaScript 不分别比较数组的每个元素。
因此,在您的示例中,您将a.name
与a.company
和b.name
与b.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