如何将这些数据合并到一个对象中?

时间:2018-08-07 18:38:09

标签: javascript jquery json node.js

这是一个棘手的问题。

所以,可以说我有两个JS对象,它们是通过REST调用和两个回调来获取的。

所以,我们有:

call1()-POST方法-将JSON解析为JS对象,路由:{{url}}/data

call1.json:

 "data": [
            { 
                "id": "1",
                "volume:" "2000"
            }, 
            { 
                "id": "2",
                "volume:" "3000"
            }, 
            { 
                "id": "3",
                "volume:" "4000"
            }, 
            { 
                "id": "4",
                "volume:" "5000"
            }
       ];

call2(req.body.id)-GET方法-将JSON解析为JS对象,路由:{{url}}/data/:id

例如,如果我将req.body.id传递为第一个响应得到的1,它将打开该id的数据。所以:

return call2(2)将通过以下JSON返回数据:call2.json:

"data": [
            { 
                "id": "1",
                "add_data": "important string",
                "add_data_2": "important string two"
            }, 
       ];

最重要的是,在进行{{url}}/data路由调用时-call()我需要提供{{url}}/data/:id路由中的所有数据,并将它们绑定到正确的id 。因此,例如,我要实现的方案是:

call()内:获取call1.json:数据,进行与第一个对象中的call2(req.body.id)一样多的ids调用,然后将add_data和{{ 1}}中的值。因此,例如最终对象看起来像这样。

add_data_two

这是我到目前为止尝试过的:

console.log(response)

"data": [
                { 
                    "id": "1",
                    "volume:" "2000",
                    "add_data": "important string",
                    "add_data_2": "important string two"
                }, 
                { 
                    "id": "2",
                    "volume:" "3000",
                    "add_data": "important string",
                    "add_data_2": "important string two"
                }, 
                { 
                    "id": "3",
                    "volume:" "4000",
                    "add_data": "important string",
                    "add_data_2": "important string two"
                }, 
                { 
                    "id": "4",
                    "volume:" "5000",
                    "add_data": "important string",
                    "add_data_2": "important string two"
                }
           ];

但是它不起作用。我如何获取所有数据,并使async get_data(req) { try { const objFirst = await call1(); //gets data let objTwo = ''; for (let i = 0; i < objFirst.data.length; i++) { objTwo = await call2({id: objFirst.data[i].id}) //gets data } return objFirst; } catch(err) { console.log("Error: ", err) } } 的数量与call2(id)一样多,并将所有这些数据合并到一个对象中?基本上,我需要ids进行此回调-> repeat,而我们在call2(id)中收到的ids也是如此。

谢谢,很抱歉,它看起来一团糟。

1 个答案:

答案 0 :(得分:1)

您可以为此使用map函数和散布运算符。像下面这样。 Call2函数只是模拟端点将返回的内容,但是您明白了。

var data = [
    {
        id: 1,
        add_data: "1111"
    },
    {
        id: 2,
        add_data: "2222"
    }
];

var data2 = [
    {
        id: 1,
        volume: "bla"
    },
    {
        id: 2,
        volume: "bla"
    }
];

function call2(id) {
    return data2.filter(x => x.id == id)[0];
}

var result = data.map(x => {
    var response = call2(x.id);
    return {
        ...x,
        ...response       
    }
})

console.dir(result[0]);

解决方案的速度(遍历数组并执行http调用以获取更多数据的速度确实很慢)。如果您有很多这些功能需要合并来自不同数据源的数据,并且取决于您的项目规模,那么我将研究RXJS或GraphQL(如果您确实需要性能)。 RXJS具有强大的功能,可以合并,合并,映射等数据。

RXJS

GraphQL