按属性对 EmberJS 对象数组进行排序

Posted

技术标签:

【中文标题】按属性对 EmberJS 对象数组进行排序【英文标题】:Sort array of EmberJS objects by property 【发布时间】:2012-02-20 22:14:43 【问题描述】:

我在 EmberJS 网站上的 Filtering 下注意到了这一点:

对 Enumerable 执行的另一个常见任务是获取 可枚举作为输入,经过排序或过滤后返回一个数组 基于一些标准。

假设我有一个 Ember 对象数组,如何按属性对它们进行排序?

App.DemoArray = Ember.ArrayController.create(
    content:[
        Ember.Object.create(name:'Joe', Age:29),
        Ember.Object.create(name:'Jim', Age:53),
        Ember.Object.create(name:'Jack', Age:12)
    ]
)

如果我想按年龄对以上内容进行排序怎么办?感谢您的帮助!

编辑: 我在 sproutcore 文档中找到了这个,但它似乎不适用于 Ember:

您可以根据某些属性或列表的值对 Enumerable 进行排序 使用 sortProperty 的属性。如果你传入多个属性, SproutCore 将对第一个属性具有相同值的项目进行排序 通过第二个参数的值,依此类推。

本页第3.8节:http://guides.sproutcore20.com/enumerables.html

【问题讨论】:

【参考方案1】:

Ember MutableArray 有一个 sortBy 方法:

https://emberjs.com/api/ember/release/classes/MutableArray

【讨论】:

【参考方案2】:

As described here 你现在可以对你的 ArrayController 进行排序了。

你这样做的方式是在你的 ArrayController 上提供额外的属性(从上面的链接粘贴):

songs = [
  trackNumber: 4, title: 'Ob-La-Di, Ob-La-Da',
  trackNumber: 2, title: 'Back in the U.S.S.R.',
  trackNumber: 3, title: 'Glass Onion',
];

songsController = Ember.ArrayController.create(
  content: songs,
  sortProperties: ['trackNumber'],
  sortAscending: true
);

songsController.get('firstObject');  // trackNumber: 2, title: 'Back in the U.S.S.R.'
songsController.addObject(trackNumber: 1, title: 'Dear Prudence');
songsController.get('firstObject');  // trackNumber: 1, title: 'Dear Prudence'

【讨论】:

【参考方案3】:

编辑:以下解决方案似乎仅适用于数值。但是,此链接将提供有关如何处理字母数字、日期等的建议:http://www.javascriptkit.com/javatutors/arraysort2.shtml

没关系,我想通了。您可以使用内置排序方法的 Javascripts 来做到这一点:

//To sort ASC
var sorted = content.sort(function(a,b) 
    return a.get('propertyYouWantToSortBy') - b.get('propertyYouWantToSortBy');
);

//To sort DESC
var sorted = content.sort(function(a,b) 
    return b.get('propertyYouWantToSortBy') - a.get('propertyYouWantToSortBy');
);

【讨论】:

【参考方案4】:

如果有人遇到这种情况,在 ember 中排序的更新方法是

 Ember.computed.sort('nameOfArrayToSort', sortDefinition)

sortDefinition 可能是一个字符串数组

 ['mainSortProperty:asc', 'secondarySortProp:desc', ...]

或比较器函数

此处的文档:http://emberjs.com/api/classes/Ember.computed.html#method_sort

【讨论】:

【参考方案5】:

正如https://github.com/emberjs/ember.js/issues/335 中所述,核心ember.js 包中不再实现排序。

【讨论】:

好像又回到了SortableMixin。 docs.edge.emberjs.com/symbols/Ember.SortableMixin.html

以上是关于按属性对 EmberJS 对象数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

按对象属性对 javascript 对象数组进行排序

PHP - 按对象属性对对象数组进行排序[重复]

javascript 按对象属性对对象数组进行排序

Java Sorting:按属性对对象数组进行排序,对象不允许使用Comparable

Swift 2.0 按属性对对象数组进行排序

php 按对象属性对对象数组进行排序。示例:查询后对Wordpress帖子进行排序