在 RxJS 中处理 JSON 个对象

Handling JSON Objects in RxJS

我是 cyclejs 和 rxjs 的新手,希望有人能帮助我解决我的问题。 我正在尝试为我的理解构建一个演示应用程序,并坚持在 DOM.

上渲染 JSON 对象

我对 near_earth_objects JSON 对象感兴趣,但我无法映射它,因为它是一个对象。 我该如何处理这种情况?下面是我的代码

function main(sources) {
    const api_key = "DEMO_KEY";
    const clickEvent$ = sources.DOM.select('.load-more').events('click');
    const request$ = clickEvent$.map(() => {
        return {
            url: "https://api.nasa.gov/neo/rest/v1/feed?start_date=2015-09-06&end_date=2016-09-13&api_key=" + api_key,
            method: "GET"
        }
    }).startWith({
        url: "https://api.nasa.gov/neo/rest/v1/feed?start_date=2016-08-31&end_date=2016-09-06&api_key=" + api_key,
        method: "GET"
    });
    const response$$ = sources.HTTP.filter(x$ => x$.url.indexOf("https://api.nasa.gov/neo/rest/v1/feed") != -1).select(response$$);
    const response$ = response$$.switch(); //flatten the stream
    const nasa$ = response$.map(response => {
        return response.body
    });

    const sinks = {
        DOM: nasa$.map(nasa =>
            ([nasa.near_earth_objects]).map(objects => {
                var vdom = [];
                //I am not very happy with this part. Can this be improved?
                for (var key in objects) {
                    if (objects.hasOwnProperty(key)) {
                        vdom.push(objects[key].map(obj => div([
                            h1(obj.name)
                        ])))
                    }
                }
                //returning the vdom does not render on the browser. vdom is an array of arrays. How should i correct this?
                console.log(vdom);
                return vdom;
            })
        ),
        HTTP: request$
    };
    return sinks;
};

从概念上讲,您想提取 nasa.near_earth_objects 的条目(即,将对象变成一个数组),然后将该数组平面映射到一个 Observable 序列。

I'll assume you're already using lodash in your project (you can do it without lodash, but you'll just need to write more glue code manually). I'll also assume you're importing RxJS' Observable as Rx.Observable; adjust the names below to suite your code.

您可以使用 _.toPairs(nasa.near_earth_objects) 完成第一个任务,通过调用 .flatMap() 并返回 Rx.Observable.from(near_objects) 来完成第二部分。生成的 Observable 将为 nasa.near_earth_objects 中的每个键发出项目。每个项目都是一个数组,item[0] 是项目的键(例如,2016-09-06),item[1] 是项目的值。

使用这个想法,您可以用类似的东西替换您的 DOM 水槽:

nasa$.map(nasa => _.toPairs(nasa.near_earth_objects))
    .flatMap(near_objects => Rx.Observable.from(near_objects))
    .map(near_object => div([
        h1(near_object[1].name)
    ]))
),