मेरे पास एक फिल्म है, मैं उसी शैली की फिल्में दिखाना चाहता हूं, मैं क्या गलत कर रहा हूं?

मेरी फिल्म (ढूंढें):

{
    "id": 1,
    "title": "Kill Bill",
    "genre_ids": [1, 10, 15]
}

// सभी फिल्में (फिल्में)

{
    "id": 2,
    "title": "Leon",
    "genre_ids": [1, 12, 15]
},
{
    "id": 3,
    "title": "Spider-man",
    "genre_ids": [12, 32, 15]
},
{
    "id": 3,
    "title": "Marvel cap",
    "genre_ids": [20, 38, 1]
},

// मेरा कोड

    return find.map(i => { // My film
        return i.genre_ids.map(ids => {
            return movies.data.results.filter(movie => { // All films
                return movie.genre_ids.filter(idMov => idMov === ids)
            })
        })
    });
1
user12919356 18 अप्रैल 2020, 07:55

2 जवाब

सबसे बढ़िया उत्तर

आपकी फिल्म (ढूंढें) एक वस्तु है, एक सरणी नहीं, इसमें कॉल करने के लिए कोई map फ़ंक्शन नहीं है।

एक समाधान:

एक ऐसा फ़ंक्शन बनाएं जो एकल शैली और फिल्मों की सरणी से शैली के अनुसार मेल खाने वाली फिल्मों की एक सरणी लौटा सके

const matchByGenre = movies => genre =>
  movies.filter(movie => movie.genre_ids.includes(genre));

मैचों के लिए फिल्म के genre_ids सरणी पर पुनरावृति करें। यह सरणी मिलानों की एक सरणी देता है, उन्हें .flat के साथ एक ही सरणी में समतल करें। सेट का उपयोग डुप्लिकेट को हटाने के लिए किया जाता है और परिणाम आपके पास सरणी के रूप में वापस आ जाता है।

const movieSet = Array.from(
  new Set(film.genre_ids.map(matchByGenre(movies)).flat())
);
const film = {
  id: 1,
  title: "Kill Bill",
  genre_ids: [1, 10, 15]
};

const movies = [
  {
    id: 2,
    title: "Leon",
    genre_ids: [1, 12, 15]
  },
  {
    id: 3,
    title: "Spider-man",
    genre_ids: [12, 32, 15]
  },
  {
    id: 4,
    title: "Marvel cap",
    genre_ids: [20, 38, 1]
  },
  {
    id: 5,
    title: "The Big Lebowski",
    genre_ids: [20, 38, 2]
  }
];

const matchByGenre = movies => genre =>
  movies.filter(movie => movie.genre_ids.includes(genre));

const movieSet = Array.from(
  new Set(film.genre_ids.map(matchByGenre(movies)).flat())
);

console.log(movieSet);

नोट: अगर matchByGenre के लिए सिंटैक्स भ्रमित करने वाला है, तो यह मूवी ऐरे लेने वाला एक करीबी फ़ंक्शन है और array::map द्वारा उपयोग किए जाने के लिए कॉलबैक फ़ंक्शन देता है।

3
Drew Reese 18 अप्रैल 2020, 06:55
return movies.data.results.filter(movie => { // All films
                return movie.genre_ids.filter(idMov => idMov === ids)
})

.filter एक खाली सरणी देता है यदि कोई तत्व पास नहीं होता है, हालांकि, एक खाली सरणी अभी भी सत्य है। तो movies.data.results.filter हमेशा एक फिल्म जोड़ देगा, भले ही।

मैंने इसे इसमें बदल दिया है:

const result = find.map(target => {
    return movies.data.results.filter(movie => {
        return movie.genres_ids.some(value => target.genres_ids.indexOf(value) > 0)
    })
})

जहां .some तुरंत सत्य लौटाएगा, यदि कोई तत्व चेक पास करता है। target.genres_ids.indexOf(value) > 0 का उपयोग करके हम देखते हैं कि फिल्म की शैली-आईडी लक्ष्य की शैली-आईडी के भीतर है या नहीं।

const movie = {
    "id": 1,
    "title": "Kill Bill",
    "genres_ids": [1, 10, 15]
};

const data = [
    {
    "id": 2,
    "title": "Leon",
    "genres_ids": [1, 12, 15]
},
{
    "id": 3,
    "title": "Spider-man",
    "genres_ids": [12, 32, 15]
},
{
    "id": 3,
    "title": "Marvel cap",
    "genres_ids": [20, 38, 1]
    },
]

const find = [movie];

const movies = { data: {results: data} };

const result = find.map(target => {
    return movies.data.results.filter(movie => {
        return movie.genres_ids.some(value => target.genres_ids.indexOf(value) > 0)
    })
})

console.log(result);
0
user2340824 18 अप्रैल 2020, 05:20