ember.js - 从数组中提取不同的属性

时间:2013-11-11 23:20:00

标签: javascript ember.js

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

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,使用计算属性或观察者来做到这一点?

1 个答案:

答案 0 :(得分: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)

参考文献: mapfilter

的MDN