Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.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 如何从三个json中创建一个新的json?_Javascript_Jquery_Json - Fatal编程技术网

Javascript 如何从三个json中创建一个新的json?

Javascript 如何从三个json中创建一个新的json?,javascript,jquery,json,Javascript,Jquery,Json,我有3个不同的json,我需要从每个json中推断出一些数据,并用它们创建一个新的json。这三个JSON有一个共同的id标识符,一个唯一的标识符,所以我们可以使用它作为匹配项,因为它们实际上是三个不同的大JSON 在JSONE上我们有id:265,在第二和第三篇文章上我们有id:265,所以当我们循环时,它们可以作为参考点 我从未以这种方式使用json,因此我不知道如何处理它。我把jQuery和JS作为标记,因为它们是我最了解的 一, 二, 三, 因此,我要寻找的最终结果是一个与此完全相同的j

我有3个不同的json,我需要从每个json中推断出一些数据,并用它们创建一个新的json。这三个JSON有一个共同的id标识符,一个唯一的标识符,所以我们可以使用它作为匹配项,因为它们实际上是三个不同的大JSON

在JSONE上我们有id:265,在第二和第三篇文章上我们有id:265,所以当我们循环时,它们可以作为参考点

我从未以这种方式使用json,因此我不知道如何处理它。我把jQuery和JS作为标记,因为它们是我最了解的

一,

二,

三,

因此,我要寻找的最终结果是一个与此完全相同的json,我们从json 1中获取id和标题作为对象,然后从json 2中获取原始的_名称,从json 3中获取year对象,我们将得到:

{
   "id":"265",
   "title":"Battle of Gettysburg",
   "original_name":"United States",
   "year":"1863"
}

上面的json只是一个例子,实际上它们是三个巨大的列表,我可以手动将它们连接起来,以获得一个json。

*

也许这就是你需要的

设arrPages=[{ id:265, 标题:葛底斯堡战役, 页码:4849, 语言:恩, 原始时间:1863年7月1日 }]; 设arrArticles=[{ id:185, 原名:美国, 国家编号:24, 第条编号:265 }, { id:73, 月份:7月, 年份:1863年, 后缀:, 第条编号:265 }]; 让getResult=arrInput,arrCompare=>{ 让joinedItems=[]; arrinport.forEachitem=>{ 让newItem={id:item.id,title:item.title}; arrCompare.forEachsubItem=>{ ifsubItem.article\u id!==未定义&&subItem.article\u id===item.id{ ifsubItem.original_name!==未定义 newItem.original\u name=子项.original\u name; ifsubItem.year!==未定义 newItem.year=子项.year; } }; joinedItems.pushnewItem; }; 返回joinedItems; }; 让结果=GetResultarPages,arrArticles;
console.logresult 基本上,您必须使用JavaScript对象模拟SQL连接:

在所有三个JSON集合上使用JSON.parse将它们转换为对象数组。 迭代JSON 1对象;对于每个对象。。。 迭代JSON 2对象,测试项目ID是否与我们正在迭代的JSON 1中的ID匹配。保存此对象。 遍历JSON 3对象,测试ID是否与我们从JSON 2中找到的对象ID匹配。保存此对象。 拥有所有三个对象后,创建一个仅包含所需字段的新对象文字:

{
  Id: obj1.id,
  Title: obj1.title,
  Original_name: obj2.original_name,
  Year: obj3.year
}

在代码的第一部分中,我创建了一个包含json数据的变量。 为了解决这个问题,我创建了两个函数,创建顺序为dosen't meter,第一个函数getJSONData将json数据作为参数,并返回一个由数组键中定义的键过滤的对象。secound函数只是检查当前键是否存在于键数组中,这个函数可以被jQuery.inArray方法替换

//JSON数据 var json=[{ id:265, 标题:葛底斯堡战役, 页码:4849, 语言:恩, 原始时间:1863年7月1日 }, { id:185, 原名:美国, 国家编号:24, 第条编号:265 }, { id:73, 月份:7月, 年份:1863年, 后缀:, 第条编号:265 }] //我想要的钥匙 变量键=[标题,原始名称,年份]; //将包含筛选数据的var var newJSON=getJSONDatajson; console.logJSON.stringifynewJSON //这是代码的主要功能 //在这里,我们在json中迭代,创建一个新对象,该对象在keys数组中定义了所有标记ID 函数getJSONDataarrayJSON{ var jsonfilted={}; arrayJSON中的forvar i{ arrayJSON[i]中的forvar键{ ifhasElementkey{ jsonfilted[key]=arrayJSON[i][key]; } } } 返回jsonfilted; } //此函数用于检查密钥数组中是否存在密钥 函数haseElementKey{ 键中的forvar元素{ ifkeys[elem]==键返回true; } 返回false;
} 这里有一些术语混淆;根据你的评论,你可能会问两个截然不同的问题中的一个。幸运的是,其中一个答案非常简单,所以让我们两个都做吧

我已经跳过了将json字符串加载到浏览器并将其转换为javascript对象的过程

如果你有三个物体 …那么,这只是在构建输出对象时分别提取所需字段的问题:

变量in1={ id:265, 标题:葛底斯堡战役, 页码:4849, 语言:恩, 原始时间:1863年7月1日 }; var in2={ id:185, 原名:美国, 国家编号:24, 第条编号:265 } 变量in3={ id:73, 月份:7月, 年份:1863年, 后缀:, 第条编号:265 } //使用选定字段构造新对象 //从in1、in2或in3中的每个对象: 变量输出={ id:in1.id, 书名:1.书名, 原始名称:in2.原始名称, 年份:3年内 }
控制台。注销 如果您想要组合n个JSON对象,例如对象列表,您可以采用功能性方法并使用reduce+filter

常数数据=[{ id:265, 标题:葛底斯堡战役, 页码:4849, 语言:恩, 原始时间:1863年7月1日 }, { id:185, 原名:美国, 国家编号:24, 第条编号:265 }, { id:73, 月份:7月, 年份:1863年, 后缀:, 第条编号:265 }]; const final=data.reduceacu,{id,title},index,array=>{ //查找任何相关对象 const matches=array.filterdata=>data.article\u id==id; 如果匹配长度{ //将其展平以便于访问。重复的键将覆盖。 const flat=matches.reducearr,item=>{…arr,…item},[] //返回新对象 返回累加器{ 平的 身份证件 标题 }; } 返回accu; }, [];
console.logfinal,“您的代码库中是否已经包含了与这些JSON字符串对应的类?”@JohnWu tbh因为我不知道该方法,所以我还没有开始写一些代码,所以说真的,您在问题中看到的是我现在得到的。问题是这些json非常大,所以这是一个简化的版本。这可能会有所帮助:请不要仅仅因为你擅长使用语言就使用语言标记。你应该把那些与你的问题相关的标签放进去。您试图在什么上下文中操作这些JSON数据在您的帖子中并不清楚。请注意,您可能正在处理对象,而不是JSON所指的字符串。这将起作用,但仅适用于示例中的特定数据-@rob.m在他的评论中指出,实际的数据源远大于三个单独的blob。建议他将此信息转移到他的问题中。这不包括基于文章_id=id进行连接的要点。@Naz yes可以。它们是更大的JSON。@rob.m检查这是否是您需要的。很抱歉没有得到你的主要问题你能解释一下你的最后一段代码吗?我知道那是你检查比赛的地方,但为什么是在console.log之后?为什么他们投了反对票?看起来它正在工作,为什么输出一个字段名数组和值混在一起?@DanielBeck true,我只需要索引的值我们只需要执行newJSON.pushjson[I][key];我想
{  
   "id":"73",
   "month":"July",
   "year":"1863",
   "suffix":"",
   "article_id":"265"
}
{
   "id":"265",
   "title":"Battle of Gettysburg",
   "original_name":"United States",
   "year":"1863"
}
{
  Id: obj1.id,
  Title: obj1.title,
  Original_name: obj2.original_name,
  Year: obj3.year
}