如何在JavaScript中高效地进行数组比较

如何在JavaScript中高效地进行数组比较,javascript,ecmascript-6,Javascript,Ecmascript 6,TMDB API返回如下所示的电影对象数组: { "vote_count": 1527, "id": 338952, "video": false, "vote_average": 7, "title": "Fantastic Beasts: The Crimes of Grindelwald", "popularity": 272.487, "poster_path": "/uyJgTzAsp3Za2TaPiZt2yaKYRIR.jpg", "original_language": "en",

TMDB API返回如下所示的电影对象数组:

{
"vote_count": 1527,
"id": 338952,
"video": false,
"vote_average": 7,
"title": "Fantastic Beasts: The Crimes of Grindelwald",
"popularity": 272.487,
"poster_path": "/uyJgTzAsp3Za2TaPiZt2yaKYRIR.jpg",
"original_language": "en",
"original_title": "Fantastic Beasts: The Crimes of Grindelwald",
"genre_ids": [
   10751,
   14,
   12
],
"backdrop_path": "/xgbeBCjmFpRYHDF7tQ7U98EREWp.jpg",
"adult": false,
"overview": "Gellert Grindelwald has .....",
"release_date": "2018-11-14"
}
它们还提供了一个API,用于返回具有键和标签的对象数组中的所有可用类型:

genres": [
{
"id": 28,
"name": "Action"
},
{
"id": 12,
"name": "Adventure"
},
{
"id": 16,
"name": "Animation"
}
]
我需要做的是从现在正在使用的API中获取一个所有独特类型的列表,以及它们的标签值

所以我的问题不是如何做到这一点,而是什么是最干净、最有效的方法

我的尝试:

let uniqueIds = new Set(), genres;

// First get all available unique genre IDs from the now playing list
for(var i = 0; i < this.state.items.length; i++){
    for(var x = 0; x < this.movies[i].genre_ids.length; x++){
        uniqueIds.add(this.movies[i].genre_ids[x])
    }
}

// build array of genre objects from unique genre IDs
genres = this.genres.filter((genre) => uniqueIds.has(genre.id));
let uniqueIds=new Set(),类型;
//首先从当前播放列表中获取所有可用的唯一流派ID
对于(var i=0;iuniqueid.has(genre.id));
1)为数组中的每个对象获取类型ID

2)
过滤出id数组中包含id的流派对象

const api=[{“投票计数”:1527,“id”:338952,“视频”:false,“投票平均数”:7,“标题”:“神奇野兽:格林德瓦尔德的罪行”,“流行”:272.487,“海报路径”:“/uyJgTzAsp3Za2TaPiZt2yaKYRIR.jpg”,“原始语言”:“恩”,“原始标题”:“神奇野兽:格林德瓦尔德的罪行”,“流派id”:[10751,14,12],“背景路径”:“/xgbcjmfpryhdf7tq7u98erewp.jpg”,“成人”:假,“概述”:“Gellert Grindelwald有…”,“发布日期”:“2018-11-14”},{“投票计数”:1527,“id”:338952,“视频”:假,“投票平均数”:7,“标题”:“神奇的野兽:格林德瓦尔德的罪行”,“人气”:272.487,“海报路径”:“/uyjgtzasp3za2tapizt2yakyyrir.jpg”,“原始语言”:“en”,“原始标题”:”《神奇野兽:格林德瓦尔德的罪行》,《类型ID》:[10751,14,16],《背景路径》:/xgbcjjmfpryhdf7tq7u98erewp.jpg,“成人”:假,“概述”:“格勒特·格林德瓦尔德有……”,“发布日期”:“2018-11-14”};
const-genres=[{“id”:28,“name”:“Action”},{“id”:12,“name”:“Adventure”},{“id”:16,“name”:“Animation”}];
//[]concat(…arr)使Consequitive阵列变平
const idArr=[].concat(…api.map(obj=>obj.genre_id));
const matchingGenres=genres.filter(obj=>idArr.includes(obj.id));
console.log(matchingGenres);
1)为数组中的每个对象获取类型ID

2)
过滤出id数组中包含id的流派对象

const api=[{“投票计数”:1527,“id”:338952,“视频”:false,“投票平均数”:7,“标题”:“神奇野兽:格林德瓦尔德的罪行”,“流行”:272.487,“海报路径”:“/uyJgTzAsp3Za2TaPiZt2yaKYRIR.jpg”,“原始语言”:“恩”,“原始标题”:“神奇野兽:格林德瓦尔德的罪行”,“流派id”:[10751,14,12],“背景路径”:/XGBCJMFPRYHDF7TQ7U98EREWP.jpg,“成人”:假,“概述”:“Gellert Grindelwald有…”,“发布日期”:“2018-11-14”},{“投票计数”:1527,“id”:338952,“视频”:假,“投票平均数”:7,“标题”:“怪兽:格林德瓦尔德的罪行”,“人气”:272.487,“海报路径”:“/uyjgasp3za2tapizt2yakyyr.jpg”,“原版语言”:“en”,“原版标题”:”《神奇野兽:格林德瓦尔德的罪行》,《类型ID》:[10751,14,16],《背景路径》:/xgbcjjmfpryhdf7tq7u98erewp.jpg,“成人”:假,“概述”:“格勒特·格林德瓦尔德有……”,“发布日期”:“2018-11-14”};
const-genres=[{“id”:28,“name”:“Action”},{“id”:12,“name”:“Adventure”},{“id”:16,“name”:“Animation”}];
//[]concat(…arr)使Consequitive阵列变平
const idArr=[].concat(…api.map(obj=>obj.genre_id));
const matchingGenres=genres.filter(obj=>idArr.includes(obj.id));

console.log(匹配类型)
Ah…非常好。这是解构?它更整洁,没有可怕的嵌套循环。我更新了答案,以说明对象数组,而不是一个对象。@shanahobo86它不是解构,这里发生的事情叫做扩展。您可以在这里阅读关于解构的内容@RobbieMilejczak,仅供参考本书的第一次编辑这个答案确实包含了解构。这是OP所指的。但是,是的,这个编辑确实包含了扩展语法。过滤掉没有包含id的类型对象啊…非常好。这是解构?它更整洁,没有可怕的嵌套循环。我更新了答案以考虑对象数组,而不是n一个对象。@shanahobo86它不是解构,这里发生的事情叫做扩展。你可以在这里阅读关于解构的内容@RobbieMilejczak,仅供参考。这个答案的第一次编辑确实包含了解构。这是OP所指的。但是,是的,这个编辑确实包含扩展语法。过滤掉没有扩展语法的类型对象包括身份证