将嵌套的 JSON 对象展平并排序到 javascript 中的数组中

     2023-02-23     144

关键词:

【中文标题】将嵌套的 JSON 对象展平并排序到 javascript 中的数组中【英文标题】:Flatten and sort a nested JSON object into an array in javascript 【发布时间】:2021-10-26 21:12:45 【问题描述】:

我有一个类似的对象:


  '2021': 
    '08': 
      '26': ['name': 'Bob', age: 34, 'name': 'Alice', age: 33],
      '27': ['name': 'Jane', age: 21]
    ,
    '09': 
      '03': ['name': 'John', age: 47, 'name': 'Sue', age: 36]
    
  ,
  '2022': 
    '04': 
      '05': ['name': 'David', age: 26]
    
  

我想将此对象展平为按日期降序排列的<year, month, day, name, age> 对象数组,因此所需的输出为:

[
  'year': '2022', 'month': '04', 'day': '05', 'name': 'David', age: 26,
  'year': '2021', 'month': '09', 'day': '03', 'name': 'John', age: 47,
  'year': '2021', 'month': '09', 'day': '03', 'name': 'Sue', age: 36,
  'year': '2021', 'month': '08', 'day': '27', 'name': 'Jane', age: 21,
  'year': '2021', 'month': '08', 'day': '26', 'name': 'Bob', age: 34,
  'year': '2021', 'month': '08', 'day': '26', 'name': 'Alice', age: 33,
]

更新:

我按照Nina的逻辑,也拆分成2个部分,先扁平化成单深度数组,然后排序。扁平化部分我有一个“丑陋”的嵌套 for 循环,它也可以工作并使用完全相同的排序代码:

let output = []
for (const year in data) 
  for (const month in data[year]) 
    for (const day in data[year][month]) 
      for (const person of data[year][month][day]) 
        const merged = Object.assign(
          'year': year,
          'month': month,
          'day': day,
        , person)
        
        output.push(merged)
      
    
  

这不太灵活,我不确定如何判断性能差异,但我会接受 Nina 的有效答案。

【问题讨论】:

到目前为止你的想法是什么? 这看起来并不难。你有什么问题? 【参考方案1】:

你可以把任务分成两部分,

    通过递归从数据中获取平面数组, 按想要的键降序排序。

const
    flat = (object, [key, ...keys], values = ) => Object
        .entries(object)
        .flatMap(([k, v]) => 
            const right =  ...values, [key]: k ;
            return Array.isArray(v)
                ? v.map(o => ( ...right, ...o ))
                : flat(v, keys, right);
        ),
    keys = ['year', 'month', 'day'],
    data =  2021:  '08':  26: [ name: 'Bob', age: 34 ,  name: 'Alice', age: 33 ], 27: [ name: 'Jane', age: 21 ] , '09':  '03': [ name: 'John', age: 47 ,  name: 'Sue', age: 36 ]  , 2022:  '04':  '05': [ name: 'David', age: 26 ]   ,
    result = flat(data, keys)
        .sort((a, b) => 
            let r;
            keys.some(k => r = b[k] - a[k]);
            return r;
        );

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

【讨论】:

展平/取消展平嵌套 JSON 对象的最快方法

】展平/取消展平嵌套JSON对象的最快方法【英文标题】:Fastestwaytoflatten/un-flattennestedJSONobjects【发布时间】:2013-10-0614:04:33【问题描述】:我将一些代码放在一起来展平和取消展平复杂/嵌套的JSON对象。它可以工作,但有点慢(触... 查看详情

如何展平多个嵌套的 json 并转换为数据框?

】如何展平多个嵌套的json并转换为数据框?【英文标题】:Howtoflattenmultiplenestedjsonandconverttodataframe?【发布时间】:2021-09-1910:40:39【问题描述】:我正在尝试将JSON(来自AirTable)转换为可用于进一步数据转换的数据帧。在将JSON转... 查看详情

Django REST Framework:将嵌套的 JSON 展平为许多对象

】DjangoRESTFramework:将嵌套的JSON展平为许多对象【英文标题】:DjangoRESTFramework:FlattennestedJSONtomanyobjects【发布时间】:2018-01-2601:53:09【问题描述】:我有这个带有父字段的子模型,我从API获取JSON(我无法控制它的格式)。models.py... 查看详情

展平嵌套的 JSON 对象

】展平嵌套的JSON对象【英文标题】:FlattennestedJSONobject【发布时间】:2021-10-1918:29:19【问题描述】:我有一个这样的json对象:constpeople=name:\'MyName\',cities:[city:\'London\',country:\'UK\',city:\'Mumbai\',country:\'IN\',city:\'NewYork\',country:\'US\'],我 查看详情

如何在传递给@csv过滤器之前用嵌套结构展平JSON

】如何在传递给@csv过滤器之前用嵌套结构展平JSON【英文标题】:HowtoflattenJSONwithnestedstructurebeforepassingto@csvfilter【发布时间】:2016-10-0106:55:15【问题描述】:我正在尝试解析一些作为AWSCLI命令输出的JSON以显示快照。我想将此数据... 查看详情

如何使用 pyspark 在 aws 胶水中展平嵌套 json 中的数组?

】如何使用pyspark在aws胶水中展平嵌套json中的数组?【英文标题】:Howtoflattenanarrayinanestedjsoninawsglueusingpyspark?【发布时间】:2019-10-0415:51:11【问题描述】:我正在尝试将JSON文件展平,以便能够将其全部加载到AWSGlue中的PostgreSQL中... 查看详情

使用 jq 展平嵌套的 JSON

】使用jq展平嵌套的JSON【英文标题】:FlattennestedJSONusingjq【发布时间】:2016-09-2904:07:45【问题描述】:我想展平嵌套的json对象,例如"a":"b":1到"a.b":1以便在solr中消化它。我有11TB的json文件,它们都是嵌套的... 查看详情

使用 JQ 展平嵌套的 Json 对象

】使用JQ展平嵌套的Json对象【英文标题】:FlattennestedJsonobjectswithJQ【发布时间】:2019-01-2605:50:47【问题描述】:我正在创建一个脚本来将JSON对象转换为“字符串”文件(用于翻译目的)。这个想法是转变:"TRANSLATION1":"text1","TRANS... 查看详情

展平任何嵌套的 json 字符串并使用 spark scala 转换为数据帧

】展平任何嵌套的json字符串并使用sparkscala转换为数据帧【英文标题】:Flattenanynestedjsonstringandconverttodataframeusingsparkscala【发布时间】:2020-04-0513:23:25【问题描述】:我正在尝试创建从任何json字符串到数据帧的数据帧。json字符串... 查看详情

从嵌套的 json 数据创建 hive 表并展平字段

】从嵌套的json数据创建hive表并展平字段【英文标题】:createhivetablefromnestedjsondatawithflattenoutfields【发布时间】:2018-12-1712:44:46【问题描述】:我想从嵌套的json数据创建外部配置单元表,但字段应该从嵌套的json中展平。例如:-"k... 查看详情

使用 Azure Synapse pyspark 过滤器根据嵌套对象的数据类型展平嵌套的 json 对象

】使用AzureSynapsepyspark过滤器根据嵌套对象的数据类型展平嵌套的json对象【英文标题】:UsingAzureSynapsepysparkfilterflattenthenestedjsonobjectsbasedonnestedobject\'sdatatype【发布时间】:2021-12-3006:17:40【问题描述】:我正在使用AzureSynapsepyspark来... 查看详情

在熊猫数据框中展平嵌套的 Json

】在熊猫数据框中展平嵌套的Json【英文标题】:flatteningnestedJsoninpandasdataframe【发布时间】:2019-03-1815:09:29【问题描述】:我正在尝试将json文件加载到pandas数据框。我发现有一些嵌套的json。以下是示例json:\'events\':[\'id\':142896214... 查看详情

Python:展平多个嵌套的字典并追加

】Python:展平多个嵌套的字典并追加【英文标题】:Python:Flattenmultiplenesteddictandappend【发布时间】:2022-01-0403:37:53【问题描述】:大家好,我正在寻求帮助以尝试展平多个嵌套字典并将它们附加到新列表中。我有多个字典,从这... 查看详情

R:JSON 到 data.frame 的通用展平

...组的大型JSON文档时特别有用。有几个SO问题涉及处理深度嵌套的JSON结构并使用plyr、lapply等功能将它们转换为数据帧 查看详情

使用 jq 为 JSON 对象的嵌套数组中的属性展平数组

】使用jq为JSON对象的嵌套数组中的属性展平数组【英文标题】:FlattenarrayforpropertiesinnestedarrayofJSONobjectsusingjq【发布时间】:2019-04-2406:38:25【问题描述】:拥有带有(简化的)Jira数据的JSON,例如:"issues":["key":"TEST-A","fields":"issueli... 查看详情

将嵌套的 Json 文件展平为 Pandas 数据框

】将嵌套的Json文件展平为Pandas数据框【英文标题】:FlatteningnestedJsonfileintopandasdataframe【发布时间】:2021-05-1408:32:42【问题描述】:我有这个json文件"OrderMaster":"Order":"item":["row_id":"1-2LDPVI0","sequence_id":"3851101","end_date":"","name":"TV-Disco 查看详情

您可以将嵌套的 JSON 结构展平为单个 autobean 吗?

】您可以将嵌套的JSON结构展平为单个autobean吗?【英文标题】:CanyouflattenanestedJSONstructureintoasingleautobean?【发布时间】:2012-09-1400:41:10【问题描述】:假设以下JSON结构:\\"is_something\\":false,\\"name\\":\\"SomeName\\",\\"subtype\\":\\"total\\":0... 查看详情

如何使用嵌套字典列表展平熊猫数据框中的列

】如何使用嵌套字典列表展平熊猫数据框中的列【英文标题】:Howtoflattenacolumninapandasdataframewithalistofnesteddictionaries【发布时间】:2020-09-0616:06:31【问题描述】:我收到了单个JSON(500个JSON)并通过append()方法将它们添加到现有列... 查看详情