2013-11-11 3 views
9

позволяет сказать, что у меня есть следующий массив, и это используется в моем контроллере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, используя рассчитанные свойства a или наблюдатели?

ответ

20

Мой первоначальный ответ на дне, но последние версии Эмбер обеспечивают очень хороший новое решение для этого:

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

Ссылки: mapBy и uniq. Рассчитанные макросы свойства отлично =)

предыдущего ответ:

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'), 

примечания, я используя «современную» функцию массива, такие как карты и фильтр здесь, если вам необходимо поддерживать старые браузеры, вы будете нужно подкрепить их или написать это другим способом. Фильтр, который я использовал для удаления дубликатов, является первым, что произошло со мной, вероятно, не очень эффективным, и если вы уже загрузили библиотеку с уникальной функцией (например, underscore.uniq), вы должны использовать ее.

Очень мало это угасающий конкретных конечно, .property('songs') на конце буквально все, что вам нужно указать, что это вычисленное свойство, которое будет храниться в кэше и пересчитывается, если песни изменения (предполагается, Ember 1.0)

Литература: MDN для map и filter

+0

Только то, что мне нужно. Благодаря! – kevnk

Смежные вопросы