如何组合具有相同名称的 JSON 对象?

Posted

技术标签:

【中文标题】如何组合具有相同名称的 JSON 对象?【英文标题】:How do I combine JSON objects with the same name? 【发布时间】:2018-07-01 17:51:49 【问题描述】:

我一直在寻找,但似乎无法找到答案。

假设我有一个数据库,其中包含有关房屋每个房间使用多少公斤食材的信息,具体取决于一年中的季节以及使用它们的厨师,尽管厨师仅用于“WHERE”子句。此信息由 Web 应用程序(不是我开发的)收集并存储在其数据库中。我正在尝试通过创建一些新页面和报告来扩展应用程序,主要用于显示信息。 SQL(Oracle)输出如下(我省略了几列,不感兴趣):

| ROOM_ID | SEASON | ING_S1 | ING_S2 | ING_S3 |
| 1234567 |   1    |   35   |        |        |
| 1234567 |   2    |        |   24   |        |
| 1234567 |   3    |        |        |   15   |
| 2233445 |   2    |        |   60   |        |
| 2233445 |   3    |        |        |   41   |

成分列来自一系列非常复杂的连接,需要从应用程序中的其他表中提取它们。

这个 Web 应用程序允许我在 html 中将其放入 JSON,并且我设法使它看起来像这样:

"1234567" : 
    "roomName" : "blabla",
    "season" : "1",
    "ingredientsS1" : "35",
    "ingredientsS2" : "",
    "ingredientsS3" : "",
,
"1234567" : 
    "roomName" : "blabla",
    "season" : "2",
    "ingredientsS1" : "",
    "ingredientsS2" : "24",
    "ingredientsS3" : "",
,
"1234567" : 
    "roomName" : "blabla",
    "season" : "3",
    "ingredientsS1" : "",
    "ingredientsS2" : "",
    "ingredientsS3" : "15",
,

等等……

我想看到的是:

"1234567" : 
    "roomName" : "blabla",
    "ingredientsS1" : "35",
    "ingredientsS2" : "24",
    "ingredientsS3" : "15",
,

我一辈子都想不出如何合并 roomID 定义的每个对象的属性!我尝试以一百万种方式重新处理查询,以查看是否可以将所有结果合并到一行(listagg 等),从而让 Web 应用程序仅创建一个 JSON 对象,我尝试查看解决方案使用 jQuery 和纯 javascript...没有骰子。

我还将开始使用 Vue.js 为页面添加更多功能,但我似乎也无法在该路线上找到任何解决方案。

感谢您的帮助,感谢您的宝贵时间!

【问题讨论】:

提供您目前拥有的脚本,我们将帮助实现这一目标 "'我设法让它看起来像这样",不,你不能拥有多个同名键。 控制台没有显示错误吗? Javascript 对象不能包含与该对象相同的键。这是您服务器的真实响应吗? 服务器所做的是它允许您使用应用程序专用的标签运行 SQL 查询,然后将数据作为文本行输出,将字段放置在您想要的任何位置同一行。 Nina,Christoforus - 当然它不是有效的 JSON,因为有多个具有相同名称的键,抱歉 - 我应该说的是 Web 应用程序允许我创建一个类似于上面的文本文档。当我在浏览器中加载文本文档时,就会出现这种情况——我没有在 JS 中使用它,因为它无效。 @LGSon 通过脚本,您的意思是查询吗?谢谢!! 如果可以将数据输出为对象数组,这个是可以解决的。 【参考方案1】:

假设您从数据库中获取数据作为对象,您可以迭代对象并获取新对象的属性。

对于赋值,您可以使用SEASON 来处理相关成分。

var data = [
         ROOM_ID: 1234567, SEASON: 1, ING_S1: 35, ING_S2: null, ING_S3: null ,
         ROOM_ID: 1234567, SEASON: 2, ING_S1: null, ING_S2: 24, ING_S3: null ,
         ROOM_ID: 1234567, SEASON: 3, ING_S1: null, ING_S2: null, ING_S3: 15 ,
         ROOM_ID: 2233445, SEASON: 2, ING_S1: null, ING_S2: 60, ING_S3: null ,
         ROOM_ID: 2233445, SEASON: 3, ING_S1: null, ING_S2: null, ING_S3: 41 
    ],
    result = ;

data.forEach(( ROOM_ID, SEASON, ING_S1, ING_S2, ING_S3 ) => 
    result[ROOM_ID] = result[ROOM_ID] ||  roomName: 'blabla', ingredientsS1: '', ingredientsS2: '', ingredientsS3: '' ;
    result[ROOM_ID]['ingredientsS' + SEASON] = [ING_S1, ING_S2, ING_S3][SEASON - 1];
);

console.log(result);
.as-console-wrapper  max-height: 100% !important; top: 0; 

【讨论】:

天哪!这太棒了!你真是个天才!!!我将代码改编为真实数据(很抱歉,由于合规法律,我无法发布),到目前为止效果很好!谢谢你!!!我在哪里可以了解更多关于你所做的事情?

以上是关于如何组合具有相同名称的 JSON 对象?的主要内容,如果未能解决你的问题,请参考以下文章

C#如何组合具有相同名称的名称值对列表中的值? [复制]

如何组合 2 个对象并在其中合并数组 [重复]

Javascript合并并组合具有相同ID的对象

如何在 Excel 中组合具有不同列名和列顺序的多个 CSV 文件?

组合两个函数时显示错误(元素重复)

设计模式 组合模式