使用函数式编程将多个对象数组中的数据映射到Javascript中的新对象
我正在尝试创建一个需要映射的对象 来自函数中包含的四个数组的数据。目标 就是使用函数编程来完成新的映射。 因此,例如,方法map、reduce、forEach、concat和 允许使用筛选器和自定义函数 我已经找到了一个使用for循环的非功能性解决方案, 我已经包括在下面了。然而,我被困在一个纯粹的问题上 功能性方法 所需结果的数据集和数据可以是 虽然我已经包含了下面的数据,但在上独立查看 目标是使用函数编程重新映射数据,使其类似于所需的输出(包括在下面) 我希望您能帮助我使用功能方法重新映射数据 从下面显示的数据开始 问题的确切文本说明: 练习26:从阵列转换到更深的树 让我们尝试创建一个更深层次的树结构。这次我们有4个 单独的数组,每个数组包含列表、视频、Boxart和书签 分别地每个对象都有一个父id,指示其父对象。我们 想要构建一个列表对象数组,每个对象都有一个名称和一个视频 数组。视频数组将包含视频的id、标题和书签 时间和最小的boxart url。换句话说,我们想要建立 以下结构: 所需输出为:使用函数式编程将多个对象数组中的数据映射到Javascript中的新对象,javascript,arrays,functional-programming,javascript-objects,Javascript,Arrays,Functional Programming,Javascript Objects,我正在尝试创建一个需要映射的对象 来自函数中包含的四个数组的数据。目标 就是使用函数编程来完成新的映射。 因此,例如,方法map、reduce、forEach、concat和 允许使用筛选器和自定义函数 我已经找到了一个使用for循环的非功能性解决方案, 我已经包括在下面了。然而,我被困在一个纯粹的问题上 功能性方法 所需结果的数据集和数据可以是 虽然我已经包含了下面的数据,但在上独立查看 目标是使用函数编程重新映射数据,使其类似于所需的输出(包括在下面) 我希望您能帮助我使用功能方法重新映射数
[
{
"name": "New Releases",
"videos": [
{
"id": 65432445,
"title": "The Chamber",
"time": 32432,
"boxart": "http://cdn-0.nflximg.com/images/2891/TheChamber130.jpg"
},
{
"id": 675465,
"title": "Fracture",
"time": 3534543,
"boxart": "http://cdn-0.nflximg.com/images/2891/Fracture120.jpg"
}
]
},
{
"name": "Thrillers",
"videos": [
{
"id": 70111470,
"title": "Die Hard",
"time": 645243,
"boxart": "http://cdn-0.nflximg.com/images/2891/DieHard150.jpg"
},
{
"id": 654356453,
"title": "Bad Boys",
"time": 984934,
"boxart": "http://cdn-0.nflximg.com/images/2891/BadBoys140.jpg"
}
]
}
]
作为起点的函数如下所示
我将函数命名为“combine”,以便调用它。还有,我
包括我的解决方案,由for循环组成,位于
函数位于书签数组之后。我只是尝试了一个功能性的解决方案
走了这么远:
return lists.map(function(list) {
return {
name: list.name,
videos:
videos.
filter(function(video) {
return video.listId === list.id;
}). // I got stuck at this point.
这是数据的起始集:
function combine() {
var lists = [
{
"id": 5434364,
"name": "New Releases"
},
{
"id": 65456475,
name: "Thrillers"
}
],
videos = [
{
"listId": 5434364,
"id": 65432445,
"title": "The Chamber"
},
{
"listId": 5434364,
"id": 675465,
"title": "Fracture"
},
{
"listId": 65456475,
"id": 70111470,
"title": "Die Hard"
},
{
"listId": 65456475,
"id": 654356453,
"title": "Bad Boys"
}
],
boxarts = [
{ videoId: 65432445, width: 130, height:200, url:"http://cdn-0.nflximg.com/images/2891/TheChamber130.jpg" },
{ videoId: 65432445, width: 200, height:200, url:"http://cdn-0.nflximg.com/images/2891/TheChamber200.jpg" },
{ videoId: 675465, width: 200, height:200, url:"http://cdn-0.nflximg.com/images/2891/Fracture200.jpg" },
{ videoId: 675465, width: 120, height:200, url:"http://cdn-0.nflximg.com/images/2891/Fracture120.jpg" },
{ videoId: 675465, width: 300, height:200, url:"http://cdn-0.nflximg.com/images/2891/Fracture300.jpg" },
{ videoId: 70111470, width: 150, height:200, url:"http://cdn-0.nflximg.com/images/2891/DieHard150.jpg" },
{ videoId: 70111470, width: 200, height:200, url:"http://cdn-0.nflximg.com/images/2891/DieHard200.jpg" },
{ videoId: 654356453, width: 200, height:200, url:"http://cdn-0.nflximg.com/images/2891/BadBoys200.jpg" },
{ videoId: 654356453, width: 140, height:200, url:"http://cdn-0.nflximg.com/images/2891/BadBoys140.jpg" }
],
bookmarks = [
{ videoId: 65432445, time: 32432 },
{ videoId: 675465, time: 3534543 },
{ videoId: 70111470, time: 645243 },
{ videoId: 654356453, time: 984934 }
];
//My non-functional solution
sizeArr = [];
for(var i = 0; i < lists.length; i++){
lists[i].videos = [];
for(var j = 0; j < videos.length; j++){
if(videos[j].listId === lists[i].id){
lists[i].videos.push(videos[j]);
}
for(var k = 0; k < bookmarks.length; k++){
if(bookmarks[k].videoId === videos[j].id && videos[j].listId === lists[i].id){
videos[j].time = bookmarks[k].time;
}
for(var l = 0; l < boxarts.length; l++){
var size = boxarts[l].width * boxarts[l].height;
sizeArr.push(size);
sizeArr = sizeArr.sort(function(min, max){
if(min < max){
return min;
}
if(boxarts[l].videoId === videos[j].id && videos[j].listId === lists[i].id){
videos[j].boxart = boxarts[l].url;
}
});
}
}
}
delete lists[i].id;
}
return lists;
}
combine();
函数组合(){
变量列表=[
{
“id”:5434364,
“名称”:“新版本”
},
{
“id”:65456475,
名称:“恐怖片”
}
],
视频=[
{
“列表ID”:5434364,
“id”:65432445,
“标题”:“商会”
},
{
“列表ID”:5434364,
“id”:675465,
“标题”:“骨折”
},
{
“列表ID”:65456475,
“id”:70111470,
“标题”:“死硬”
},
{
“列表ID”:65456475,
“id”:654356453,
“标题”:“坏男孩”
}
],
boxarts=[
{videoId:65432445,宽:130,高:200,url:“http://cdn-0.nflximg.com/images/2891/TheChamber130.jpg" },
{videoId:65432445,宽:200,高:200,url:“http://cdn-0.nflximg.com/images/2891/TheChamber200.jpg" },
{videoId:675465,宽:200,高:200,url:“http://cdn-0.nflximg.com/images/2891/Fracture200.jpg" },
{videoId:675465,宽:120,高:200,url:“http://cdn-0.nflximg.com/images/2891/Fracture120.jpg" },
{videoId:675465,宽:300,高:200,url:“http://cdn-0.nflximg.com/images/2891/Fracture300.jpg" },
{videoId:70111470,宽:150,高:200,url:“http://cdn-0.nflximg.com/images/2891/DieHard150.jpg" },
{videoId:70111470,宽:200,高:200,url:“http://cdn-0.nflximg.com/images/2891/DieHard200.jpg" },
{videoId:654356453,宽:200,高:200,url:“http://cdn-0.nflximg.com/images/2891/BadBoys200.jpg" },
{videoId:654356453,宽:140,高:200,url:“http://cdn-0.nflximg.com/images/2891/BadBoys140.jpg" }
],
书签=[
{videoId:65432445,时间:32432},
{videoId:675465,time:3534543},
{videoId:70111470,时间:645243},
{videoId:654356453,时间:984934}
];
//我的非功能解决方案
sizeArr=[];
对于(变量i=0;i
这是可行的,但效率不高。首先可以从数组中创建字典或映射,以便快速查找id。这样就不需要过滤器了
我还避免了改变初始数据结构
var列表=[{
“id”:5434364,
“名称”:“新版本”
}, {
“id”:65456475,
名称:“恐怖片”
}],
视频=[{
“列表ID”:5434364,
“id”:65432445,
“标题”:“商会”
}, {
“列表ID”:5434364,
“id”:675465,
“标题”:“骨折”
}, {
“列表ID”:65456475,
“id”:70111470,
“标题”:“死硬”
}, {
“列表ID”:65456475,
“id”:654356453,
“标题”:“坏男孩”
}],
boxarts=[{
videoId:65432445,
宽度:130,
身高:200,
url:“http://cdn-0.nflximg.com/images/2891/TheChamber130.jpg"
}, {
function combine () {
var Genres = [];
lists.forEach(function(genre) {
var currGenre = makeGenre(genre.name, []);
videos.filter(function(video){
if (video.listId === genre.id) {
return video;
}
}).forEach(function(video) {
var time = bookmarks.filter(function(mark){
if (video.id === mark.videoId) {
return mark.time;
}
})[0];
var art = boxarts.filter(function(art){
if (video.id === art.videoId) {
return art;
}
}).sort(function (a, b) { return a.width * a.height > b.width * b.height; })[0];
currGenre.videos.push(makeVideo(video.id, video.title, time, art));
});
Genres.push(currGenre);
});
return Genres;
}
function makeGenre (name) {
return {
name: name,
videos: []
};
}
function makeVideo (id, title, time, boxart) {
return {
id: id,
title: title,
time: time,
boxart: boxart
};
}
return lists.map(function(list) {
return {
name: list.name,
videos:
videos.
filter(function(video) {
return video.listId === list.id;
}).
concatMap(function(video) {
return Array.zip(
bookmarks.filter(function(bookmark) {
return bookmark.videoId === video.id;
}),
boxarts.filter(function(boxart) {
return boxart.videoId === video.id;
}).
reduce(function(acc,curr) {
return acc.width * acc.height < curr.width * curr.height ? acc : curr;
}),
function(bookmark, boxart) {
return { id: video.id, title: video.title, time: bookmark.time, boxart: boxart.url };
});
})
};
});
Array.prototype.concatMap = function(projectionFunctionThatReturnsArray) {
return this.
map(function(item) {
return projectionFunctionThatReturnsArray(item);
}).
// apply the concatAll function to flatten the two-dimensional array
concatAll();
};
Array.prototype.concatAll = function() {
var results = [];
this.forEach(function(subArray) {
results.push.apply(results, subArray);
});
return results;
};