For-in cicle 只返回 array.push 中的最后一个结果

时间:2021-05-03 09:23:56

标签: javascript arrays vue.js object for-in-loop

我使用 Vue.js 2 并且我有一个从 API(https://developers.themoviedb.org/3/getting-started/introduction 这个)中获取的对象数组,这些对象链接到一个变量,该变量是输入的 v 模型。因此,无论何时变量更改数组也会随着 @keyup 时调用 API 的函数而更改。 该数组是关于电影和电视节目的。 它的结构如下:

(20) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, __ob__: we]
0:
backdrop_path: (...)
first_air_date: (...)
genre_ids: Array(3)
0: 18
1: 80
2: 9648
length: 3
__ob__: we {value: Array(3), dep: ce, vmCount: 0}
__proto__: Array
genres_name: ["Mistero"]
id: (...)
media_type: (...)
name: (...)
origin_country: (...)
original_language: (...)
original_name: (...)
overview: (...)
popularity: (...)
poster_path: (...)
vote_average: (...)
vote_count: (...)

这个数组为我提供了关于电影和电视剧的有用信息,但它没有给我回馈类型,至少不是这些类型的名称,而是在键 genre_ids: Array(3) 中与它们相关的 ID。现在,我调用了另一个 API,它提供了这样的流派列表:

(19) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}]
0:
id: 28
name: "Azione"
__proto__: Object
1:
id: 12
name: "Avventura"
__proto__: Object
2: {id: 16, name: "Animazione"}
3: {id: 35, name: "Commedia"}
4: {id: 80, name: "Crime"}
5: {id: 99, name: "Documentario"}
6: {id: 18, name: "Dramma"}
7: {id: 10751, name: "Famiglia"}
8: {id: 14, name: "Fantasy"}
9: {id: 36, name: "Storia"}
10: {id: 27, name: "Horror"}
11: {id: 10402, name: "Musica"}
12: {id: 9648, name: "Mistero"}
13: {id: 10749, name: "Romance"}
14: {id: 878, name: "Fantascienza"}
15: {id: 10770, name: "televisione film"}
16: {id: 53, name: "Thriller"}
17: {id: 10752, name: "Guerra"}
18: {id: 37, name: "Western"}
length: 19
__proto__: Array(0)

我想要的是比较两个数组的 id 并将流派列表的流派名称传递给每个对象的第一个数组,所以我这样做了

const newArray = this.searchResults.map ((element) => {
                        let objectResults = element.genre_ids;
                        console.log('objectResults', objectResults);
                        let object = element;
                        console.log('single-object', object);

                        this.genresName.forEach(genre => {
                            if (objectResults.includes(genre.id) ) {
                                object.genres_name = [];
                                for(var key in genre) {
                                    if (key == 'name') {
                                        console.log('key', genre[key]);
                                        let keyName = '';
                                        keyName = keyName + genre[key];
                                        object.genres_name.push(keyName);
                                    }
                                }
                            }
                        })
                        console.log(this.searchResults);

我的问题是我可以正确读取每个节目的每个类型的名称,因此 id 比较有效,但是当将它们推送到第一个数组的每个元素时,只有最后一个被推送,只有一个。大多数节目应该有不止一种类型,因为它们在 genre_ids: Array 中有不止一个 id,但我只能获得其中一种,而且总是最后一种

1 个答案:

答案 0 :(得分:0)

也许有一种更漂亮的方法可以做到这一点,但这是有效的。这将在电影数组中创建一个名为 genreNames 的新数组,其中将包含相应的流派名称。

const genres = [
  { id: 12, name: "Avventura" },
  { id: 16, name: "Animazione" },
  { id: 35, name: "Commedia" },
  { id: 80, name: "Crime" },
  { id: 99, name: "Documentario" },
  { id: 18, name: "Dramma" },
];

const movies = [
  { genre_ids: [12, 16], name: "Movie 1" },
  { genre_ids: [80, 99], name: "Movie 2" },
  { genre_ids: [18, 12, 99], name: "Movie 3" },
];

// our final result
let finalArray = [];
movies.map(element => {
  // create a temp array for the genres
  let genreNames = []
  element.genre_ids.map(genre => {
    // each genreid from the movie, find the corresponding name from the genres array
    genreNames.push(genres.find(val => val.id === genre).name)
  })
  // finally push the original movie and the newly create array for the names
  finalArray.push({ ...element, genreNames })
})
console.log(finalArray);

相关问题