jiy*_*jiy 20 arrays sorting coffeescript
使用这样的数组:
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' }
]
Run Code Online (Sandbox Code Playgroud)
并且您希望使用coffeescript按姓氏排序,您可以这样做:
users.sort (a,b) ->
return if a.lname.toUpperCase() >= b.lname.toUpperCase() then 1 else -1
Run Code Online (Sandbox Code Playgroud)
我尝试使用这样的函数:
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]
Run Code Online (Sandbox Code Playgroud)
它是这样调用的:
users.sort sortBy "lname", false, (a) ->
return a.toUpperCase()
Run Code Online (Sandbox Code Playgroud)
但是没有正确排序数组.
有没有办法按超过1个字段排序,即按州排序,然后按姓氏排序?我希望改进上面的"sortBy"函数,并添加至少2个字段排序的能力.
Ric*_*asi 20
有一种更简单的方法.只需重用您的通用排序函数,并使用||以下方法将它们连接起来:
sortBy = (key, a, b, r) ->
r = if r then 1 else -1
return -1*r if a[key] > b[key]
return +1*r if a[key] < b[key]
return 0
users.sort (a,b) ->
sortBy('id', a, b, true) or
sortBy('lname', a, b) or
sortBy('fname', a, b)
Run Code Online (Sandbox Code Playgroud)
功能便宜.然后,您可以为此构建一个抽象:
sortByMultiple = (a, b, keys) ->
return r if (r = sortBy key, a, b) for key in keys
return 0
users.sort (a,b) -> sortByMultiple a, b, ['id', 'lname', 'fname']
Run Code Online (Sandbox Code Playgroud)
但是你失去了在每个参数上设置顺序或其他参数的能力.
Nev*_*vir 16
或者,你可能要考虑使用下划线的sortBy,这样你就不必自己实现它:
_(users).sortBy (u) -> [u.state, u.lname.toUpperCase()]
Run Code Online (Sandbox Code Playgroud)