Ember sortBy on property:desc与reverse不同

时间:2016-10-21 05:06:43

标签: javascript ember.js

在Ember 2中,我在Enumerable上尝试sortBy

sortBy('something:asc')的工作正确无误。但sortBy('something:desc')sortBy('something:asc').reverse()不同。 (不是desc?)

我尝试将something属性更改为布尔值或字符串或数字。它似乎只是"字符串"类型适用于reverse

1 个答案:

答案 0 :(得分:5)

实际上,Ember.Enumerable.sortBy方法没有采取任何方向,如here所示,这就是Ember.computed.sort的工作方式,如文档示例所示,以及跟踪内部调用时here

这意味着您的代码中"asc"也无效。你只是偶然得到了正确的结果。 Relevant github issue

此外,只有字符串作为sortBy参数的原因是因为sortBy internally calls Ember.get在每个元素上按您提供的名称提取属性,以及属性名字是字符串。

换句话说,sortBy的签名是sortBy(property)docs

sortBy确定元素顺序的方法是从ember-runtime调用compare方法,遗憾的是,这是一个内部操作,没有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)。