如何简化此代码?通过第二个数组的共享属性(_id)获取一个数组的属性(标题)

时间:2019-05-31 06:24:26

标签: javascript arrays

以下代码有效,但是如何使它更简洁? 在两个数组中,我们有一个公共属性(_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); 
}

3 个答案:

答案 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));