2016-02-07 2 views
1

Я работаю через study guide на Github, и я пытаюсь решить проблему, которая связывает фильтр и карту, чтобы получить ответ. Итак, у меня есть массив, и я должен использовать два метода для выбора идентификаторов видео с рейтингом 5.0. Вот массив:Объединение методов filter() и map() в javascript

function() { 
var newReleases = [ 
    { 
     "id": 70111470, 
     "title": "Die Hard", 
     "boxart": "http://cdn-0.nflximg.com/images/2891/DieHard.jpg", 
     "uri": "http://api.netflix.com/catalog/titles/movies/70111470", 
     "rating": 4.0, 
     "bookmark": [] 
    }, 
    { 
     "id": 654356453, 
     "title": "Bad Boys", 
     "boxart": "http://cdn-0.nflximg.com/images/2891/BadBoys.jpg", 
     "uri": "http://api.netflix.com/catalog/titles/movies/70111470", 
     "rating": 5.0, 
     "bookmark": [{ id:432534, time:65876586 }] 
    }, 
    { 
     "id": 65432445, 
     "title": "The Chamber", 
     "boxart": "http://cdn-0.nflximg.com/images/2891/TheChamber.jpg", 
     "uri": "http://api.netflix.com/catalog/titles/movies/70111470", 
     "rating": 4.0, 
     "bookmark": [] 
    }, 
    { 
     "id": 675465, 
     "title": "Fracture", 
     "boxart": "http://cdn-0.nflximg.com/images/2891/Fracture.jpg", 
     "uri": "http://api.netflix.com/catalog/titles/movies/70111470", 
     "rating": 5.0, 
     "bookmark": [{ id:432534, time:65876586 }] 
    } 
]; 

Теперь мой код выглядит следующим образом:

newReleases.filter(function(video){ 
    return video.rating == 5.0; 
    }).map (function(video) { 
    return { id: video.id } 
    }); 
} 

Мой мыслительный процесс, я первый вызов метода фильтра и применить тест (video.rating == 5,0) и вернуть элементы, которые проходят тест. Затем я использую метод map для применения функции к элементам, которые передали тест, чтобы вернуть то, что я хочу, идентификаторы видео с рейтингом 5.0, с помощью map return 'video.id'. Теперь, когда я исполняю, я получаю эту ошибку:

TypeError: 'undefined' is not an object (evaluating 'videoids.sortBy')

Этот код ошибки действительно бросает меня, потому что я не вижу «videoids» переменной в массиве, и это не кажется, что мне нужно примените .SortBy.

Так что я прошу уточнить код ошибки, пожалуйста. Я также пробовал этот код в разных моделях и не придумал правильного, поэтому я был бы очень благодарен за то, что я не делаю. Причина, по которой я чувствую себя уверенно в своем коде, заключается в том, что я применил очень похожий код к очень похожим упражнениям в [Eloquent Javascript] в конце главы 5 (упражнение 5.2. Разница в возрасте матери и ребенка). Я потратил несколько часов (больше, чем я хотел бы признать), застрял на этом, и я просмотрел переполнение стека около двух часов. Я мог бы легко нажать кнопку получения ответа, но я боюсь, что я ничего не узнаю, сделав это.

Может ли кто-нибудь помочь мне?

+0

Код как вы написали, он отлично работает - https://jsfiddle.net/yvy06sn1/ В вашем коде должно быть что-то еще. –

+0

работает здесь также и в Chrome, в какой ОС, в браузере? Перезагрузите компьютер и повторите попытку! – Gavriel

+0

Я запускаю код через учебное пособие. Я запускаю его на сафари ver. 6.1.3 (не мой компьютер). Я пытался перезапустить, к сожалению, не работал. Спасибо, что ответили! – Phil

ответ

1

Пожалуйста, добавьте return. В противном случае вы возвращаетесь undefined.

return newReleases.filter(function(video) { 
    //... 
+0

Я добавил возврат, и я больше не получаю неопределенное. Браузер все же находит что-то не так с моим ответом. Хммм, может быть, я должен попробовать запустить его в пустом браузере за пределами учебного пособия. – Phil

+0

Просто, чтобы быть ясным, с моим кодом ничего не случилось, что возвращение? – Phil

0

Вы должны делать что-то неправильно, потому что это меня работает. См. https://jsfiddle.net/887mfh10/1/.

var newReleases = [ 
    { 
     "id": 70111470, 
     "title": "Die Hard", 
     "boxart": "http://cdn-0.nflximg.com/images/2891/DieHard.jpg", 
     "uri": "http://api.netflix.com/catalog/titles/movies/70111470", 
     "rating": 4.0, 
     "bookmark": [] 
    }, 
    { 
     "id": 654356453, 
     "title": "Bad Boys", 
     "boxart": "http://cdn-0.nflximg.com/images/2891/BadBoys.jpg", 
     "uri": "http://api.netflix.com/catalog/titles/movies/70111470", 
     "rating": 5.0, 
     "bookmark": [{ id:432534, time:65876586 }] 
    }, 
    { 
     "id": 65432445, 
     "title": "The Chamber", 
     "boxart": "http://cdn-0.nflximg.com/images/2891/TheChamber.jpg", 
     "uri": "http://api.netflix.com/catalog/titles/movies/70111470", 
     "rating": 4.0, 
     "bookmark": [] 
    }, 
    { 
     "id": 675465, 
     "title": "Fracture", 
     "boxart": "http://cdn-0.nflximg.com/images/2891/Fracture.jpg", 
     "uri": "http://api.netflix.com/catalog/titles/movies/70111470", 
     "rating": 5.0, 
     "bookmark": [{ id:432534, time:65876586 }] 
    } 
]; 

var ids = newReleases.filter(function(video){ 
    return video.rating == 5.0; 
    }).map (function(video) { 
    return { id: video.id } 
    }); 

alert(JSON.stringify(ids)); // see console 
+0

Спасибо Амиру, что кажется консенсусом. Я думаю, что это может иметь какое-то отношение к моему браузеру. Могу ли я получить разъяснения по коду ошибки, который я получил? – Phil

+0

Думаю, я просто ответил на свой вопрос. Так как я не возвращал фильтр или не объявлял переменную перед ней, он возвращался не определенно, не так ли? – Phil

Смежные вопросы