Фильтрация для определенных узлов в JSON — использовать grep или карту?

#jquery #json #jsonp

#jquery — запрос #json #jsonp #jquery

Вопрос:

Я использую themoviedb.org API для извлечения информации о фильмах. Он возвращает эти данные JSON.

Мне нужно отфильтровать это двумя разными способами, но не обязательно в одном и том же обратном вызове. В одном случае мне нужно вернуть только жанры, а в другом случае мне нужно вернуть только «фоновые изображения», где size.toLowerCase() == 'original' , и оба экземпляра выполняются в success для вызова ajax, т. Е.:

 $.ajax({
    url: "http://api.themoviedb.org/2.1/Movie.getInfo/en/json/API_KEY/"   filmID,
    dataType: "jsonp",
    context: document.body,
    success: function(data){
        ...
    }
});
  

Будут ли grep или map подходящим методом для использования здесь? В любом случае, как я могу эффективно получить эту информацию?

Ответ №1:

вы бы использовали grep для фильтрации нужных вам объектов и размещения их в другом массиве, map — для добавления дополнительных объектов в JSON путем выполнения определенной функции для каждого элемента

 var results = array();

$.ajax({
    url: "http://api.themoviedb.org/2.1/Movie.getInfo/en/json/API_KEY/"   filmID,
    dataType: "jsonp",
    context: document.body,
    success: function(data){
        data = eval(data);
        results = $.grep(data, function(data) {
            return data[0].posters.image.size == "original";
        });
    }
});
  

Комментарии:

1. data.posters.size возвращает пустой массив и изменение его на data.posters.image.size выдает следующую ошибку: "TypeError: 'undefined' is not an object (evaluating 'data.posters.image.size')"

2. теперь стало лучше? лол, это просто случай правильного определения индексов, иногда вложенный материал трудно читать!

3. Извините, нет. Для чего eval ?

Ответ №2:

Звучит как задание для $.map — если вам нужно вернуть только жанры, $.map позволит вам создать массив только из этих частей объекта, в то время как $.grep создаст массив полных объектов фильма.