Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用函数式编程将多个对象数组中的数据映射到Javascript中的新对象_Javascript_Arrays_Functional Programming_Javascript Objects - Fatal编程技术网

使用函数式编程将多个对象数组中的数据映射到Javascript中的新对象

使用函数式编程将多个对象数组中的数据映射到Javascript中的新对象,javascript,arrays,functional-programming,javascript-objects,Javascript,Arrays,Functional Programming,Javascript Objects,我正在尝试创建一个需要映射的对象 来自函数中包含的四个数组的数据。目标 就是使用函数编程来完成新的映射。 因此,例如,方法map、reduce、forEach、concat和 允许使用筛选器和自定义函数 我已经找到了一个使用for循环的非功能性解决方案, 我已经包括在下面了。然而,我被困在一个纯粹的问题上 功能性方法 所需结果的数据集和数据可以是 虽然我已经包含了下面的数据,但在上独立查看 目标是使用函数编程重新映射数据,使其类似于所需的输出(包括在下面) 我希望您能帮助我使用功能方法重新映射数

我正在尝试创建一个需要映射的对象 来自函数中包含的四个数组的数据。目标 就是使用函数编程来完成新的映射。 因此,例如,方法map、reduce、forEach、concat和 允许使用筛选器和自定义函数

我已经找到了一个使用for循环的非功能性解决方案, 我已经包括在下面了。然而,我被困在一个纯粹的问题上 功能性方法

所需结果的数据集和数据可以是 虽然我已经包含了下面的数据,但在上独立查看

目标是使用函数编程重新映射数据,使其类似于所需的输出(包括在下面)

我希望您能帮助我使用功能方法重新映射数据 从下面显示的数据开始

问题的确切文本说明:

练习26:从阵列转换到更深的树

让我们尝试创建一个更深层次的树结构。这次我们有4个 单独的数组,每个数组包含列表、视频、Boxart和书签 分别地每个对象都有一个父id,指示其父对象。我们 想要构建一个列表对象数组,每个对象都有一个名称和一个视频 数组。视频数组将包含视频的id、标题和书签 时间和最小的boxart url。换句话说,我们想要建立 以下结构:

所需输出为:

[
    {
        "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;
};