我有一个数组,我正在使用A()
转换为Ember
数组,因为我想使用一些Ember
数组方法,例如filterBy()
,但它没有产生我想要的结果。将原版数组转换为Ember
数组的正确方法是什么?
余烬:
import Component from '@ember/component';
import { computed } from '@ember/object';
import { A } from '@ember/array';
export default Component.extend({
movieGenreIds: computed.map('movies', function(movie, index) {
return movie.genre_ids;
}),
genresNames: computed('movieGenreIds', 'allGenres', function() {
let genresArray = A(this.get('genres')); // <--- conversion here
this.get('movieGenreIds').forEach((movieGenreId, movieGenreIndex) => {
console.log('MOVIE_GENRE_IDS!!!', genresArray);
console.log('FILTERBY ID^^^', genresArray.filterBy('id', movieGenreIds.toString())); // <-- not returning desired results
});
}),
});
余烬路由(数据来自 moviedb api,models
表示所提供json
中的数据结构(:
import Route from '@ember/routing/route';
import RSVP from 'rsvp'
export default Route.extend({
model() {
return RSVP.hash({
movies: this.store.findAll('movie'),
genres: this.store.findAll('genre'),
})
.then(data => data);
},
});
好吧,首先.then(data => data);
实际上什么都没有。只需删除它。
接下来,如果您不禁用数组的原型扩展,则无需将普通数组转换为ember 数组。 所以替换这个:
let genresArray = A(this.get('genres'));
有了这个:
let genresArray = this.get('genres');
或者在 Ember 3.1+ 中:
let genresArray = this.genres;
现在一个有趣的问题是,movie
模型genre_ids
什么?我强烈假设它是一个返回数组的计算属性。但是一些代码会有所帮助。
但是,movieGenreIds
的依赖项密钥是错误的。您可能应该这样做:
movieGenreIds: computed.map('movies.@each.genre_ids', function(movie, index) {
return movie.genre_ids;
}),
但是,您的实际问题现在可能是这可能会返回数组数组。所以像这样:
[[1,2],[3],[],[4,5]]
现在你.forEach
它,但是movieGenreId
现在可能仍然是一个数组。接下来你做movieGenreId.toString()
(你实际上做movieGenreIds.toString()
,但我认为这是一个错字,因为这没有意义,因为你在循环中不使用movieGenreId
(。但是,对数组执行.toString()
可能不会给您所需的结果 - id。
所以你的解决方法可能是修复movieGenreIds
CP(代码适用于 ember 3.1+(:
movieGenreIds: computed('movies.@each.genre_ids', function() {
return this.movies
.map(m => m.genre_ids)
.reduce((a, b) => [...a, ...b]);
}),