Ecmascript 6 重构胖箭头嵌套的rxjs流

Ecmascript 6 重构胖箭头嵌套的rxjs流,ecmascript-6,rxjs,reactive-programming,Ecmascript 6,Rxjs,Reactive Programming,我在玩。为了更好地学习rxjs 我正在处理的数组如下所示。我只是想从数组中取出id 我能够在工作中得到答案,但我觉得答案可以写得更好 var movieLists = [ { name: "New Releases", videos: [ { "id": 70111470, "title": "Die Hard",

我在玩。为了更好地学习rxjs

我正在处理的数组如下所示。我只是想从数组中取出id

我能够在工作中得到答案,但我觉得答案可以写得更好

var movieLists = [
        {
            name: "New Releases",
            videos: [
                {
                    "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 }]
                }
            ]
        },
        {
            name: "Dramas",
            videos: [
                {
                    "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 }]
                }
            ]
        }
    ];
这是我想出的答案

          movieLists
                  .map( movieList => movieList.videos
                  .map(video => video.id)  )   // don't like this part
                  .concatAll()
我基本上是把一张地图嵌套在另一张地图中,然后调用concat

是否有可能重构第二个映射胖箭头,使其位于第一个映射胖箭头之外

.map()
.map()

映射到电影后,可以使用
concatAll()

var movieLists=[
{
名称:“新版本”,
视频:[
{
“id”:70111470,
“头衔”:“死硬”,
“boxart”:http://cdn-0.nflximg.com/images/2891/DieHard.jpg",
“uri”:http://api.netflix.com/catalog/titles/movies/70111470",
“评级”:4.0,
“书签”:[]
},
{
“id”:654356453,
“头衔”:“坏男孩”,
“boxart”:http://cdn-0.nflximg.com/images/2891/BadBoys.jpg",
“uri”:http://api.netflix.com/catalog/titles/movies/70111470",
“评级”:5.0,
“书签”:[{id:432534,时间:65876586}]
}
]
},
{
名称:“戏剧”,
视频:[
{
“id”:65432445,
“头衔”:“商会”,
“boxart”:http://cdn-0.nflximg.com/images/2891/TheChamber.jpg",
“uri”:http://api.netflix.com/catalog/titles/movies/70111470",
“评级”:4.0,
“书签”:[]
},
{
“id”:675465,
“标题”:“骨折”,
“boxart”:http://cdn-0.nflximg.com/images/2891/Fracture.jpg",
“uri”:http://api.netflix.com/catalog/titles/movies/70111470",
“评级”:5.0,
“书签”:[{id:432534,时间:65876586}]
}
]
}
];
可观察到的接收(电影演员)
.map(movieList=>movieList.videos)
.concatAll()
.map(video=>video.id)
.do(console.log)
.subscribe()

您可以在映射到电影后使用
concatAll()

var movieLists=[
{
名称:“新版本”,
视频:[
{
“id”:70111470,
“头衔”:“死硬”,
“boxart”:http://cdn-0.nflximg.com/images/2891/DieHard.jpg",
“uri”:http://api.netflix.com/catalog/titles/movies/70111470",
“评级”:4.0,
“书签”:[]
},
{
“id”:654356453,
“头衔”:“坏男孩”,
“boxart”:http://cdn-0.nflximg.com/images/2891/BadBoys.jpg",
“uri”:http://api.netflix.com/catalog/titles/movies/70111470",
“评级”:5.0,
“书签”:[{id:432534,时间:65876586}]
}
]
},
{
名称:“戏剧”,
视频:[
{
“id”:65432445,
“头衔”:“商会”,
“boxart”:http://cdn-0.nflximg.com/images/2891/TheChamber.jpg",
“uri”:http://api.netflix.com/catalog/titles/movies/70111470",
“评级”:4.0,
“书签”:[]
},
{
“id”:675465,
“标题”:“骨折”,
“boxart”:http://cdn-0.nflximg.com/images/2891/Fracture.jpg",
“uri”:http://api.netflix.com/catalog/titles/movies/70111470",
“评级”:5.0,
“书签”:[{id:432534,时间:65876586}]
}
]
}
];
可观察到的接收(电影演员)
.map(movieList=>movieList.videos)
.concatAll()
.map(video=>video.id)
.do(console.log)
.subscribe()

只需更改运算符的顺序即可

Observable.from(movieLists)
  .map(movie => movie.videos)
  .concatAll()
  .map(movie => movie.id);

只需更改运算符的顺序即可

Observable.from(movieLists)
  .map(movie => movie.videos)
  .concatAll()
  .map(movie => movie.id);

您可以在单个操作员中执行此操作:

Observable.from(movieLists)
  .concatMap(
    movie => movie.videos, 
    (_, video) => video.id
  )

您可以在单个操作员中执行此操作:

Observable.from(movieLists)
  .concatMap(
    movie => movie.videos, 
    (_, video) => video.id
  )

我甚至没想过。我还发现使用flatmap很有效,但这更好,谢谢。我甚至没有想到这一点。我还发现使用flatmap很有效,但这更好,谢谢。我找到了使用flatmap控制台.log(movieLists.map(movieList=>movieList.videos.flatmap(videos=>videos.map)(post=>post.id))的方法。我同意rxjs没有任何用处,但我的目标是适应它。好的,很好-也许你想发布你的解决方案并接受它作为答案,因为其他人看到不同的解决方案可能会感兴趣。我找到了如何使用平面地图控制台.log(movieLists.map(movieList=>movieList.videos).flatMap(videos=>videos.map(post=>post.id))实现这一点的方法.我同意rxjs没有任何用处,但我的目标是适应它。好的,很好-也许你想发布你的解决方案并接受它作为答案,因为其他人看到不同的解决方案可能会很有趣