【发布时间】:2012-04-05 12:11:44
【问题描述】:
使用这样的数组:
users = [
{ id: 1, fname: 'Fred', lname: 'Flinstone', state: 'CA' },
{ id: 2, fname: 'George', lname: 'Winston', state: 'FL' },
{ id: 3, fname: 'Luke', lname: 'Skywalker', state: 'CA' }
]
如果你想用 coffeescript 按姓氏排序,你可以这样做:
users.sort (a,b) ->
return if a.lname.toUpperCase() >= b.lname.toUpperCase() then 1 else -1
我尝试使用这样的函数:
sortBy = (field, reverse, primer) ->
key = (x) ->
return if primer? then primer x[field] else x[field]
return (a,b) ->
A = key a
B = key b
return (A < B ? -1 : (A > B ? 1 : 0)) * [1,-1][+!!reverse]
是这样调用的:
users.sort sortBy "lname", false, (a) ->
return a.toUpperCase()
但这并没有正确地对数组进行排序。
有没有办法按多个字段排序,即先按州排序,然后按姓氏?我希望改进上面的“sortBy”功能,并添加至少按 2 个字段排序的功能。
【问题讨论】:
-
还有什么比这“更好”的呢? (实际上我会使用
<=而不是<来帮助保持排序稳定。) -
你可以在那里使用三元运算符:
return a.lname.toUpperCase() > b.lname.toUpperCase() ? 1 : -1 -
“更好”和“失败”是什么意思?
-
@LightnessRacesinOrbit:条件运算符是 C-ish 语言家族中唯一的三元运算符,包括 JavaScript、AFAICT。因此,术语“三元运算符”长期以来一直被认为是“条件运算符”的同义词。 “条件”是可取的,但“三元”是完全有效的。
-
@LightnessRacesinOrbit:以“ahem”开头的句子带有强烈的含义,即“你说的是错误的”。你可能没有说过,但你肯定暗示过。
标签: arrays sorting coffeescript