在 Ember 2 中,我在 Enumerable 上尝试了 sortBy
。
sortBy('something:asc')
工作正常。但是 sortBy('something:desc')
与 sortBy('something:asc').reverse()
不同。 (不是desc
吗?)
我试图将 something
属性更改为 bool 值、字符串或数字。似乎只有“字符串”类型适用于 reverse
。
最佳答案
实际上,Ember.Enumerable.sortBy方法不采取任何方向,如所见 here ,就是这样Ember.computed.sort有效,如在文档示例中以及在对 here 进行内部调用时所见.
这意味着在您的代码中 "asc"
也不起作用。你只是偶然得到正确的结果。 Relevant github issue
此外,只有字符串作为 sortBy
的参数的原因是因为 sortBy
internally calls Ember.get在每个元素上按您提供的名称提取属性,属性名称是字符串。
换句话说,sortBy
的签名是sortBy(property)
( docs )
sortBy
确定元素顺序的方法是调用 compare来自 ember-runtime 的方法,不幸的是,这是一个内部操作,没有 API 可以影响它。
以下是正确进行双向排序的方法:
- 升序:
sortBy('something')
- 降序:
sortBy('something').reverse()
(不幸的是)
我相信这是故意的,因为 Ember 遵循 convention over configuration范式,基本上迫使您偏爱使用 Ember.computed.sort
,尤其是在性能很重要的情况下。
sortingBy: ['something:desc'],
sortedCollection: Ember.computed.sort('collection', 'sortingBy')
您可以做的另一个解决方法是使用 toArray 将 Enumerable 转换为常规 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
)。
关于javascript - 属性 :desc is not the same as reverse 上的 Ember sortBy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40168813/