Javascript 属性上的余烬排序:desc与reverse不同
在Ember 2中,我对一个可枚举项进行了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”也不起作用。你只是碰巧得到了正确的结果
排序
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
)