以下代码有效,但是如何使它更简洁? 在两个数组中,我们有一个公共属性(_id)。有了这个属性,我从数组2获得了一个属性。 更加具体: 数组“电影”包含具有属性“ _id”和“标题”的电影项目。 数组“收藏夹电影”仅包含“ _id”。 我想返回用户喜欢的电影列表作为标题。
var favoritemovies = [1111,3333];
const movies = [
{_id:1111, title: 'movie1'},
{_id:2222, title: 'movie2'},
{_id:3333, title: 'movie3'},
];
var movieTitles = [];
for (var i = 0; i < favoritemovies.length; i++) {
var favMovies = movies.filter(movie => movie._id == favoritemovies[i])
movieTitles.push(favMovies);
var movieTitlesFlat = movieTitles.flat();
}
for (var i = 0; i < favoritemovies.length; i++) {
console.log(movieTitlesFlat[i].title);
}
答案 0 :(得分:1)
归纳为_id
索引的对象,然后在.map
上调用favoritemovies
,总体复杂度为O(N)
:
var favoritemovies = [1111,3333];
const movies = [
{_id:1111, title: 'movie1'},
{_id:2222, title: 'movie2'},
{_id:3333, title: 'movie3'},
];
const moviesById = movies.reduce((a, { _id, title }) => {
a[_id] = title;
return a;
}, {});
const titles = favoritemovies.map(id => moviesById[id]);
console.log(titles);
(这也可以通过嵌套循环操作来完成,但是如果不先将movies
转换为某种形式的映射,则复杂度将为O(N^2)
)
答案 1 :(得分:1)
您可以先在filter()
上使用movies
来获取_id
出现在favoritemovies
内的所有项目,然后将map()
过滤到的数组获得标题。
var favoritemovies = [1111,3333];
const movies = [
{_id:1111, title: 'movie1'},
{_id:2222, title: 'movie2'},
{_id:3333, title: 'movie3'},
];
const res = movies.filter(x => favoritemovies.includes(x._id)).map(x => x.title);
console.log(res)
上述算法的时间复杂度为O(n ^ 2)
。可以通过创建O(n)
和Set
来使其favoritemovies
var favoritemovies = [1111,3333];
let favmovset = new Set(favoritemovies)
const movies = [
{_id:1111, title: 'movie1'},
{_id:2222, title: 'movie2'},
{_id:3333, title: 'movie3'},
];
const res = movies.filter(x => favmovset.has(x._id)).map(x => x.title);
console.log(res)
答案 2 :(得分:0)
var favoritemovies = [1111,3333];
const movies = [
{_id:1111, title: 'movie1'},
{_id:2222, title: 'movie2'},
{_id:3333, title: 'movie3'},
];
var movieTitles = movies.filter( (e)=> favoritemovies.includes(e._id));
movieTitles.forEach( (e)=> console.log(e.title));