9

假设我有以下数组,这在我的控制器中使用

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

我想在我的控制器上有一个属性,它返回一系列独特的流派

例如

genres: function() {
  ...
}...

在这种情况下会返回

['pop', 'rock']

是否有一些优雅的方法可以使用计算属性或观察者使用 ember 来做到这一点?

4

1 回答 1

20

我最初的答案在底部,但最新的 Ember 版本为此提供了一个非常好的新解决方案:

genres: Ember.computed.mapBy('songs', 'genre'),
uniqueGenres: Ember.computed.uniq('genres'),

参考:mapByuniq。计算属性宏很棒 =)

上一个答案:

genres: function() {
  return this.get('songs').map(function(song){
    return song.genre
  }).filter(function(genre, index, arr){
    return arr.indexOf(genre) == index // throw away any instances which are not first
  })
}.property('songs'),

请注意,我在这里使用了“现代”数组函数,例如 map 和 filter,如果您需要支持较旧的浏览器,则需要填充这些函数或以另一种方式编写。我用来删除重复项的过滤器是我第一个想到的,它可能不是很高效,如果你已经加载了一个具有独特功能的库(如underscore.uniq),你应该使用它。

当然,其中很少是 Ember 特定的,.property('songs')最后你需要指定这是一个计算属性,如果歌曲发生变化,它将被缓存并重新计算(假设 Ember 1.0)

参考: MDN for mapfilter

于 2013-11-12T00:49:18.127 回答