Javascript 属性上的余烬排序:desc与reverse不同

Javascript 属性上的余烬排序:desc与reverse不同,javascript,ember.js,Javascript,Ember.js,在Ember 2中,我对一个可枚举项进行了排序 sortBy('something:asc')工作正常。但是sortBy('something:desc')与sortBy('something:asc')不同。(它不是desc?) 我试图将某物属性更改为布尔值、字符串或数字。似乎只有“string”类型可以使用reverse实际上,该方法没有任何方向,如图所示,这就是工作原理,如docs示例中所示,以及在执行内部调用时所示 这意味着在您的代码中,“asc”也不起作用。你只是碰巧得到了正确的结果

在Ember 2中,我对一个可枚举项进行了
排序

sortBy('something:asc')
工作正常。但是
sortBy('something:desc')
sortBy('something:asc')不同。(它不是
desc
?)

我试图将
某物
属性更改为布尔值、字符串或数字。似乎只有“string”类型可以使用
reverse

实际上,该方法没有任何方向,如图所示,这就是工作原理,如docs示例中所示,以及在执行内部调用时所示

这意味着在您的代码中,“asc”
也不起作用。你只是碰巧得到了正确的结果

此外,之所以只有字符串作为
sortBy
的参数工作,是因为每个元素上的
sortBy
都要按您提供的名称提取属性,而属性名称是字符串

换句话说,
sortBy
的签名是
sortBy(属性)
()

sortBy
确定元素顺序的方法是从ember运行时调用方法,不幸的是,这是一个内部操作,没有API可以影响它

以下是如何正确地在两个方向进行排序:

  • 升序:
    sortBy('something')
  • 降序:
    sortBy('something')。reverse()
    (很不幸)
我相信这是有意为之的,因为Ember遵循了这个范例,基本上迫使您倾向于使用
Ember.computed.sort
,尤其是在性能非常重要的情况下

sortingBy: ['something:desc'],
sortedCollection: Ember.computed.sort('collection', 'sortingBy')
另一种解决方法是使用该方法将可枚举项转换为常规JS数组,对其进行排序,然后使用新排序的数组覆盖属性:

const sortedDesc = this.get('something')
  .toArray() // convert the enumerable to a regular JS array
  .sort(/* your descending sort comparison function */);

this.set('something', sortedDesc);

这会更快(无需反转数组),但会更占用内存,因为它会在每次排序时创建一个新数组(通过调用
toArray