如何在JavaScript中连接两个结构相同的JSON数据集?

如何在JavaScript中连接两个结构相同的JSON数据集?,javascript,json,Javascript,Json,下面的代码调用两个不同的API,解析JSON数据并将其显示在网页上。两个JSON数据集具有相同的结构,一个有5列,另一个有20列 我正在使用的JavaScript代码如下所示。如何将两个JSON数据集合并为一个,这样就有了一个包含25列的结果数据集,使我能够在所有这25列中搜索/引用 两个JSON数据集的数据结构如下: { “数据表”:{ “数据”:[ [ “TSLA”, "2019-02-22", "2019-02-22", 58995.9, -231.2 ] ], “栏目”:[ { “名称

下面的代码调用两个不同的API,解析JSON数据并将其显示在网页上。两个JSON数据集具有相同的结构,一个有5列,另一个有20列

我正在使用的JavaScript代码如下所示。如何将两个JSON数据集合并为一个,这样就有了一个包含25列的结果数据集,使我能够在所有这25列中搜索/引用

两个JSON数据集的数据结构如下:

{
“数据表”:{
“数据”:[
[
“TSLA”,
"2019-02-22",
"2019-02-22",
58995.9,
-231.2
]
],
“栏目”:[
{
“名称”:“股票代码”,
“类型”:“字符串”
},
{
“姓名”:“日期”,
“类型”:“日期”
},
{
“名称”:“上次更新”,
“类型”:“日期”
},
{
“名称”:“ev”,
“类型”:“BigDecimal(15,3)”
},
{
“名称”:“evebit”,
“类型”:“BigDecimal(15,3)”
}
]
},
“元”:{
“下一个光标\u id”:空
}
}
类似的东西

var
Json_1={
“数据表”:{
“数据”:[‘aa’、‘bb’、‘cc’],
“列”:['x','y','z']
},
“元”:{“元1”:15,“元2”:87}
},
Json_2={
“数据表”:{
“数据”:['ZZbb','cZc'],
“列”:['xf'、'yf'、'zf'、'zgg']
},
“元”:{“元1”:879,“元2”:4}
},
Json_cumul_typ0={Json_1,Json_2},
Json_cumul_typ1={
“数据”:[].concat(Json_1.datatable.data,Json_2.datatable.data),
“列”:[].concat(Json_1.datatable.columns,Json_2.datatable.columns),
}
;
log(Json\u cumul\u typ0);

log(Json_cumul_typ1)首先进行所有API调用会更容易,在进行任何处理之前,将它们组合成一个结果对象。当前,您正在进行一个API调用,然后在进行下一个API调用之前处理结果

我认为异步回调的本质使您的任务更加困难。我建议使用async/await来简化逻辑。大概是这样的:

var apiurls = [
    'api1.json',
    'api2.json'
  ],
  elroot = document.getElementById('root');

// Combine all API responses into this object
allResults = {
  data: [[]],
  columns: []
};


// loadJSON() is probably not async, so here is an async version using fetch()
async function loadJSON(url) {
  response = await fetch(url);
  return response.json()
}

// Wrap logic in async function so await can be used
(async () => {
    // First make all the API calls
    for (url of apiurls) {
        results = await loadJSON(url);
        allResults.data[0] = allResults.data[0].concat(results.datatable.data[0]);
        allResults.columns = allResults.columns.concat(results.datatable.columns);
    }

    // Then process combined allResults object here once.
    var daten = allResults.data[0],
        spalten = allResults.columns,
        output = '';

    for (var i = 0; i < spalten.length; i++) {
        output = '<p>' + spalten[i].name + ': ' + daten[i] + '</p>';
        elroot.innerHTML += output;
    }
})();
var apirls=[
“api1.json”,
'api2.json'
],
elroot=document.getElementById('root');
//将所有API响应合并到此对象中
所有结果={
数据:[[]],
列:[]
};
//loadJSON()可能不是异步的,因此这里有一个使用fetch()的异步版本
异步函数loadJSON(url){
响应=等待获取(url);
返回response.json()
}
//在异步函数中包装逻辑,以便可以使用wait
(异步()=>{
//首先进行所有API调用
for(APIURL的url){
结果=等待加载JSON(url);
allResults.data[0]=allResults.data[0].concat(results.datatable.data[0]);
allResults.columns=allResults.columns.concat(results.datatable.columns);
}
//然后流程将所有结果对象组合在一起一次。
var daten=allResults.data[0],
spalten=allResults.columns,
输出='';
对于(变量i=0;i';
elroot.innerHTML+=输出;
}
})();
您正在使用的
loadJSON()
可能不是异步的。以下是您可以使用的一些备选方案:

现在,您需要连接字段中的列。因此,您可以做的是创建上面其中一个的深度副本。有比下面提到的更好的方法

var object3 = JSON.parse(JSON.stringify(object1));
现在要连接列,请执行此操作

object3.datatable.columns=object3.datatable.columns.concatenate(object2.datatable.columns)

如果要串联多个字段,可以在对象上使用for循环,请检查数据类型是否为数组并进行串联


我希望这有帮助。

我不明白。如果不是问题,则无需说明信息来源。仅举一个必须累积的2个json文件的例子?缩进代码被认为是一种很好的样式。这样做可以更容易地识别代码的结构,即使是像json这样简单的代码。更好的问题可能涉及样本输入和样本输出,因此其他人只需担心转换。@Joshua感谢您的帮助指导,我仍在学习,并将尽最大努力更精确地提供您提到的样本。感谢您的支持。是的,这正是JSON数据的结构。如果我的问题不够具体,请道歉,下次我会尽量说得更准确。@Joshua,答案还不够准确,至少考虑到我的JavaScript知识水平。我不明白如何在我上面给出的具体代码示例中实现它。是的,
await
不能与
loadJSON()结合使用。您提供的
fetch();我更新了我的答案,将其包含在我答案的主代码中。您也可以直接调用fetch()方法,而不是将其包装在loadJSON()中<代码>等待
只能在异步函数中使用,因此您可能也必须将所有逻辑封装在异步函数中。谢谢。行
results=await loadJSON(url)
在控制台中导致以下错误消息:
未捕获语法错误:wait仅在异步函数中有效。
@F.Marks:是,这是错误信息
var object3 = JSON.parse(JSON.stringify(object1));