Каждое видео имеет интересную коллекцию моментов, каждое из которых представляет время, в течение которого снимок экрана интересен или представляет заголовок в целом.Обратите внимание, что массивы boxarts и интересноMoments расположены на одной и той же глубине в дереве.Получите время среднего интересного момента и наименьшего URL-адреса обложки одновременно с Array.zip()
.Вернуть объект {id, title, time, url} для каждого видео. Любой может помочь с Array.zip()
?
const movieLists = [
{
name: "New Releases",
videos: [
{
"id": 70111470,
"title": "Die Hard",
"boxarts": [
{ width: 150, height: 200, url: "http://cdn-0.nflximg.com/images/2891/DieHard150.jpg" },
{ width: 200, height: 200, url: "http://cdn-0.nflximg.com/images/2891/DieHard200.jpg" }
],
"url": "http://api.netflix.com/catalog/titles/movies/70111470",
"rating": 4.0,
"interestingMoments": [
{ type: "End", time: 213432 },
{ type: "Start", time: 64534 },
{ type: "Middle", time: 323133 }
]
},
{
"id": 654356453,
"title": "Bad Boys",
"boxarts": [
{ width: 200, height: 200, url: "http://cdn-0.nflximg.com/images/2891/BadBoys200.jpg" },
{ width: 140, height: 200, url: "http://cdn-0.nflximg.com/images/2891/BadBoys140.jpg" }
],
"url": "http://api.netflix.com/catalog/titles/movies/70111470",
"rating": 5.0,
"interestingMoments": [
{ type: "End", time: 54654754 },
{ type: "Start", time: 43524243 },
{ type: "Middle", time: 6575665 }
]
}
]
},
{
name: "Instant Queue",
videos: [
{
"id": 65432445,
"title": "The Chamber",
"boxarts": [
{ width: 130, height: 200, url: "http://cdn-0.nflximg.com/images/2891/TheChamber130.jpg" },
{ width: 200, height: 200, url: "http://cdn-0.nflximg.com/images/2891/TheChamber200.jpg" }
],
"url": "http://api.netflix.com/catalog/titles/movies/70111470",
"rating": 4.0,
"interestingMoments": [
{ type: "End", time: 132423 },
{ type: "Start", time: 54637425 },
{ type: "Middle", time: 3452343 }
]
},
{
"id": 675465,
"title": "Fracture",
"boxarts": [
{ width: 200, height: 200, url: "http://cdn-0.nflximg.com/images/2891/Fracture200.jpg" },
{ width: 120, height: 200, url: "http://cdn-0.nflximg.com/images/2891/Fracture120.jpg" },
{ width: 300, height: 200, url: "http://cdn-0.nflximg.com/images/2891/Fracture300.jpg" }
],
"url": "http://api.netflix.com/catalog/titles/movies/70111470",
"rating": 5.0,
"interestingMoments": [
{ type: "End", time: 45632456 },
{ type: "Start", time: 234534 },
{ type: "Middle", time: 3453434 }
]
}
]
}
];
Array.zip = function(boxarts, interestingMoments, combinerFunction) {
let counter,
results = [];
for(counter = 0; counter < Math.min(boxarts.length, interestingMoments.length); counter++) {
results.push(combinerFunction(boxarts[counter],interestingMoments[counter]));
}
return results;
};
let arr1 = movieLists.map(function(movieList) {
return movieList.videos.map(function(video) {
return Array.zip(
video.boxarts.reduce(function(acc,curr) {
if (acc.width * acc.height < curr.width * curr.height) {
return acc;
}
else {
return curr;
}
}),
video.interestingMoments.filter(function(interestingMoment) {
return interestingMoment.type === "Middle";
}),
function(boxart, interestingMoment) {
return {id: video.id, title: video.title, time: interestingMoment.time, url: boxart.url};
});
});
});
// //to enable deep level flatten use recursion with reduce and concat
let concatArr = (function flattenDeep(arr1) {
return arr1.reduce((acc, val) => Array.isArray(val) ? acc.concat(flattenDeep(val)) : acc.concat(val), []);
})(arr1);
console.log(concatArr)
РЕШЕНИЕ БЕЗ Array.zip()
. Любой может помочь с Array.zip()
?
let arr1 = movieLists.map(function (movieList) {
return movieList.videos.map(function (v) {
return {
id: v.id,
title: v.title,
time: v.interestingMoments
.reduce(function (accumulator, currentValue) {
if (currentValue.type === "Middle") {
return accumulator = currentValue
}
}).time,
url: v.boxarts.reduce((accumulator, currentValue) => {
var area = currentValue.width * currentValue.height;
if (area < accumulator.area) {
return { area: area, url: currentValue.url };
}
return accumulator;
}, { area: 10000000, url: '' }).url
}
});
});
let concatArr = (function flattenDeep(arr1) {
return arr1.reduce((acc, val) => Array.isArray(val) ? acc.concat(flattenDeep(val)) : acc.concat(val), []);
})(arr1);
console.log(concatArr)
Результат решения ![enter image description here](https://i.stack.imgur.com/LCRYI.jpg)
РЕШЕНИЕ с _.zipWith
- Лодаш
var _ = require('lodash');
let arr1 = movieLists.map(function(movieList) {
return movieList.videos.map(function(video) {
return _.zipWith(
[video.boxarts.reduce(function(acc,curr) {
if (acc.width * acc.height < curr.width * curr.height) {
return acc;
}
else {
return curr;
}
})],
video.interestingMoments.filter(function(interestingMoment) {
return interestingMoment.type === "Middle";
}),
function(boxart, interestingMoment) {
return {id: video.id, title: video.title, time: interestingMoment.time, url: boxart.url};
});
});
});
//to enable deep level flatten use recursion with reduce and concat
let concatArr = (function flattenDeep(arr1) {
return arr1.reduce((acc, val) => Array.isArray(val) ? acc.concat(flattenDeep(val)) : acc.concat(val), []);
})(arr1);
console.log(concatArr)