Javascript Объект - Карта через объект и значение фильтра - PullRequest
0 голосов
/ 16 марта 2020

В настоящее время я могу получить список представлений, предоставленных Netflix.

Однако мой фильтр оценок не возвращает то, что я хочу. Я хочу вернуть список с tmdb: оценка 8 или выше. Так как структура данных (хранящаяся в переменной searchResult) разделяется по типу provider_type и значению, в настоящий момент я получаю любую оценку 8 или выше.

Есть ли способ сделать это? Если возможно, объедините это с моей функцией провайдера Netflix, чтобы вернуть показы Netflix с tmdb: оценка 8 или больше?

Спасибо.

Node JS Файл

const JustWatch = require("justwatch-api")
const netflixId = 8;

function print_result (name, result) {
    console.log(name+":");
    console.log(JSON.stringify(result, null, 4));
    console.log("\n\n\n\n");
}

(async function(){
    var justwatch = new JustWatch();

    var searchResult = await justwatch.search('a');

    searchResult.items.map(function(movie){
         movie.offers.forEach(offer => {
             if(offer.provider_id === netflixId){
                 print_result("search", searchResult)
             }
         })
     })


    searchResult.items.map(function(movie){
        movie.scoring.filter(score =>{
            if(score.provider_type ==="tmdb:score" && score.value > 8) {
                print_result("search", searchResult)
            }
        })
    })

}) ();



Структура данных (как хранится в переменной searchResult, объект, содержащий счетчик total_results и массив items объектов, каждый из которых представляет mov ie)

{
    "total_results": 27476,
    "items": [
        {
            "jw_entity_id": "ts80908",
            "id": 80908,
            "title": "A Very English Scandal",
            "full_path": "/us/tv-show/a-very-english-scandal",
            "full_paths": {
                "SHOW_DETAIL_OVERVIEW": "/us/tv-show/a-very-english-scandal"
            },
            "poster": "/poster/60368458/{profile}",
            "original_release_year": 2018,
            "tmdb_popularity": 3.422,
            "object_type": "show",
            "offers": [
                {
                    "type": "aggregated",
                    "monetization_type": "flatrate",
                    "provider_id": 9,
                    "currency": "USD",
                    "subtitle_languages": [
                        "en"
                    ],
                    "presentation_type": "sd",
                    "element_count": 1,
                    "new_element_count": 1,
                    "date_provider_id": "2019-09-14_9",
                    "date_created": "2019-09-14"
                },
                {
                    "type": "aggregated",
                    "monetization_type": "flatrate",
                    "provider_id": 9,
                    "currency": "USD",
                    "subtitle_languages": [
                        "en"
                    ],
                    "presentation_type": "hd",
                    "element_count": 1,
                    "new_element_count": 1,
                    "date_provider_id": "2019-09-14_9",
                    "date_created": "2019-09-14"
                }
            ],
            "scoring": [
                {
                    "provider_type": "imdb:score",
                    "value": 7.8
                },
                {
                    "provider_type": "tmdb:popularity",
                    "value": 3.422
                },
                {
                    "provider_type": "tmdb:score",
                    "value": 8.1
                }
            ]
        },
        {
            "jw_entity_id": "tm205151",
            "id": 205151,
            "title": "Alpha",
            "full_path": "/us/movie/alpha-2015",
            "full_paths": {
                "MOVIE_DETAIL_OVERVIEW": "/us/movie/alpha-2015"
            },
....

Ответы [ 3 ]

0 голосов
/ 16 марта 2020

Если вы просто хотите отфильтрованный массив объектов mov ie с tmdb: Score> = 8.0, вот фрагмент для демонстрации (Обратите внимание, что я смоделировал объект в том же формате, что и у вас с массивом items только из двух почти идентичных объектов, один с показателем> 8,0 и один с показателем <8,0 с целью демонстрации): </p>

const searchResult = {
    "total_results": 27476,
    "items": [
        {
            "jw_entity_id": "ts80908",
            "id": 80908,
            "title": "A Very English Scandal",
            "full_path": "/us/tv-show/a-very-english-scandal",
            "full_paths": {
                "SHOW_DETAIL_OVERVIEW": "/us/tv-show/a-very-english-scandal"
            },
            "poster": "/poster/60368458/{profile}",
            "original_release_year": 2018,
            "tmdb_popularity": 3.422,
            "object_type": "show",
            "offers": [
                {
                    "type": "aggregated",
                    "monetization_type": "flatrate",
                    "provider_id": 9,
                    "currency": "USD",
                    "subtitle_languages": [
                        "en"
                    ],
                    "presentation_type": "sd",
                    "element_count": 1,
                    "new_element_count": 1,
                    "date_provider_id": "2019-09-14_9",
                    "date_created": "2019-09-14"
                },
                {
                    "type": "aggregated",
                    "monetization_type": "flatrate",
                    "provider_id": 9,
                    "currency": "USD",
                    "subtitle_languages": [
                        "en"
                    ],
                    "presentation_type": "hd",
                    "element_count": 1,
                    "new_element_count": 1,
                    "date_provider_id": "2019-09-14_9",
                    "date_created": "2019-09-14"
                }
            ],
            "scoring": [
                {
                    "provider_type": "imdb:score",
                    "value": 7.8
                },
                {
                    "provider_type": "tmdb:popularity",
                    "value": 3.422
                },
                {
                    "provider_type": "tmdb:score",
                    "value": 8.1
                }
            ]
        },{
            "jw_entity_id": "ts80909",
            "id": 80908,
            "title": "Some Other Title",
            "full_path": "/us/tv-show/a-very-english-scandal",
            "full_paths": {
                "SHOW_DETAIL_OVERVIEW": "/us/tv-show/a-very-english-scandal"
            },
            "poster": "/poster/60368458/{profile}",
            "original_release_year": 2018,
            "tmdb_popularity": 3.422,
            "object_type": "show",
            "offers": [
                {
                    "type": "aggregated",
                    "monetization_type": "flatrate",
                    "provider_id": 9,
                    "currency": "USD",
                    "subtitle_languages": [
                        "en"
                    ],
                    "presentation_type": "sd",
                    "element_count": 1,
                    "new_element_count": 1,
                    "date_provider_id": "2019-09-14_9",
                    "date_created": "2019-09-14"
                },
                {
                    "type": "aggregated",
                    "monetization_type": "flatrate",
                    "provider_id": 9,
                    "currency": "USD",
                    "subtitle_languages": [
                        "en"
                    ],
                    "presentation_type": "hd",
                    "element_count": 1,
                    "new_element_count": 1,
                    "date_provider_id": "2019-09-14_9",
                    "date_created": "2019-09-14"
                }
            ],
            "scoring": [
                {
                    "provider_type": "imdb:score",
                    "value": 7.8
                },
                {
                    "provider_type": "tmdb:popularity",
                    "value": 3.422
                },
                {
                    "provider_type": "tmdb:score",
                    "value": 7.9
                }
            ]
        }]
 }

 const desiredMovies = searchResult.items.filter(movie => {
 	let tmdbScoring = movie.scoring.find(scoringObj => scoringObj.provider_type==="tmdb:score");
 	return tmdbScoring && tmdbScoring.value>=8.0;
 })

 console.log(desiredMovies);

Кроме того, я заметил, что в коде, который вы добавили, возникает проблема, которая может объяснить, почему вы получаете все фильмы.

В приведенном ниже коде вы печатаете searchResult один раз для каждого найденного вами успешного результата, который является объектом, который содержит счетчик и весь массив items, так что вы увидите все фильмы в вашей структуре данных.

//searchResult is the object that contains the entire array "items"
searchResult.items.map(function(movie){
    movie.scoring.filter(score =>{
        if(score.provider_type ==="tmdb:score" && score.value > 8) {
            //the variable searchResult has scope here so it will contain the entire list
            print_result("search", searchResult)
        }
    })
})

Отказ от ответственности : следующее подразумевается только как конструктивная критика.

Кроме того, я вполне уверен, что вы используете .map и .filter неверно. Обратные вызовы, предоставленные им, должны возвращать логическое значение, чтобы сами функции .map или .filter могли возвращать новый массив (важно отметить, что .map и .filter не влияют на исходный массив). Предоставленные обратные вызовы не только не возвращают логическое значение, но результаты самой карты или фильтра не сохраняются в переменной. Итак, я предлагаю вам взглянуть на документы по этим функциям высшего порядка, чтобы лучше понять, как они работают:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

Поэтому я предлагаю вам создать функцию, которая возвращает отфильтрованный список фильмов из списка items вашего объекта и печатает его в целом.

0 голосов
/ 16 марта 2020

const netflixId = 8

const searchResult = {
    "items": [
        {
            "offers": [
                {
                    "type": "aggregated",
                    "monetization_type": "flatrate",
                    "provider_id": 8,
                    "currency": "USD",
                    "subtitle_languages": [
                        "en"
                    ],
                    "presentation_type": "sd",
                    "element_count": 1,
                    "new_element_count": 1,
                    "date_provider_id": "2019-09-14_9",
                    "date_created": "2019-09-14"
                },
                {
                    "type": "aggregated",
                    "monetization_type": "flatrate",
                    "provider_id": 9,
                    "currency": "USD",
                    "subtitle_languages": [
                        "en"
                    ],
                    "presentation_type": "hd",
                    "element_count": 1,
                    "new_element_count": 1,
                    "date_provider_id": "2019-09-14_9",
                    "date_created": "2019-09-14"
                }
            ],
            "scoring": [
                {
                    "provider_type": "imdb:score",
                    "value": 7.8
                },
                {
                    "provider_type": "tmdb:popularity",
                    "value": 3.422
                },
                {
                    "provider_type": "tmdb:score",
                    "value": 8.1
                }
            ]
        },
        {
            "offers": [
                {
                    "type": "aggregated",
                    "monetization_type": "flatrate",
                    "provider_id": 8,
                    "currency": "USD",
                    "subtitle_languages": [
                        "en"
                    ],
                    "presentation_type": "sd",
                    "element_count": 1,
                    "new_element_count": 1,
                    "date_provider_id": "2019-09-14_9",
                    "date_created": "2019-09-14"
                },
                {
                    "type": "aggregated",
                    "monetization_type": "flatrate",
                    "provider_id": 9,
                    "currency": "USD",
                    "subtitle_languages": [
                        "en"
                    ],
                    "presentation_type": "hd",
                    "element_count": 1,
                    "new_element_count": 1,
                    "date_provider_id": "2019-09-14_9",
                    "date_created": "2019-09-14"
                }
            ],
            "scoring": [
                {
                    "provider_type": "imdb:score",
                    "value": 7.8
                },
                {
                    "provider_type": "tmdb:popularity",
                    "value": 3.422
                },
                {
                    "provider_type": "tmdb:score",
                    "value": 7.9
                }
            ]
        }
]}
        
        
const movies = searchResult.items.filter(item => {
  return item.offers.some(offer => offer.provider_id === netflixId) && item.scoring.some(score => score.provider_type === 'tmdb:score'&&score.value>=8)
})

console.log(movies)
const movies = searchResult.items.filter(item => {
  return item.offers.some(offer => offer.provider_id === netflixId) && item.scoring.some(score => score.provider_type === 'tmdb:score'&&score.value>=8)
})

Эта функция фильтра отфильтровывает элемент на основе 2 условий.

  1. В предложениях товаров одно из предложений должно быть от netflix
  2. При подсчете очков один из баллов должен быть tmdb: счет, а счет должен быть больше или равен 8.

Надеюсь, это поможет.

0 голосов
/ 16 марта 2020

Как я понимаю, вы хотите фильтровать шоу Netflix с помощью tmdb: оценка 8 или выше, верно? Так можем ли мы просто использовать filter для фильтрации элементов?

searchResult.items.filter(function(movie){
    var scorings = movie.scoring;
    var filterScores = 
        scorings.filter(score => score.provider_type ==="tmdb:score" && score.value > 8);
    return filterScores.length > 0;
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...