使用reduce对JSON对象进行层次分组

vwkv1x7d  于 2022-11-26  发布在  其他
关注(0)|答案(1)|浏览(117)

目前,我有一个对象数组,需要根据键值转换为层次结构。我使用reduce来实现这一点,我可以在第一级键(AREA)上进行分组,但我希望它也能递归地发生在其他字段上,最终结果应该是一个看起来像下面的层次结构,我的层次结构很大,但例如这里我取了3级
Bellow是我的JSON对象数组

[{
    "AREA": "EMEA",
    "SUPER_REGION": "West Mediterranean Region",
    "STATE": "Portugal",
},
{
    "AREA": "USAC",
    "SUPER_REGION": "United States",
    "STATE": "california",

},
{
    "AREA": "USAC",
    "SUPER_REGION": "United States",
    "STATE": "Texas",

},
{
    "AREA": "ASIA",
    "SUPER_REGION": "Japan",
    "STATE": "Japan",

},
{
    "AREA": "EMEA",
    "SUPER_REGION": "North Europe Region",
    "STATE": "ECOE",

},
{
    "AREA": "USAC",
    "SUPER_REGION": "United States",
    "STATE": "Georgia",

}]

预期结果

[{
    "EMEA": {
        "West Mediterranean Region": {
            "Portugal": null
        },
        "North Europe Region": {
            "ECOE": null
        }
    }
},
{
    "USAC": {
        "United States": {
            "Georgia": null
        },
        "United States": {
            "Texas": null
        },
        "United States": {
            "california": null
        }
    }
},
{
    "ASIA": {
        "Japan": {
            "Japan": null
        }
    }
}]

到目前为止,我已经尝试过的代码:

const result = data.reduce((grouped_Data, hierarchy) => {
    const region = hierarchy["AREA"];
    if (grouped_Data[region] == null) grouped_Data[region] = [];
    grouped_Data[region].push(hierarchy);
    return grouped_Data;
}, {});
xiozqbni

xiozqbni1#

您可以将reduce与每个AREA作为累加器中的关键字,并在每个级别分组

const input = [{AREA:"EMEA",SUPER_REGION:"West Mediterranean Region",STATE:"Portugal"},{AREA:"USAC",SUPER_REGION:"United States",STATE:"california"},{AREA:"USAC",SUPER_REGION:"United States",STATE:"Texas"},{AREA:"ASIA",SUPER_REGION:"Japan",STATE:"Japan"},{AREA:"EMEA",SUPER_REGION:"North Europe Region",STATE:"ECOE"},{AREA:"USAC",SUPER_REGION:"United States",STATE:"Georgia"}];

const grouped = input.reduce((acc, { AREA, SUPER_REGION, STATE }) => {
  acc[AREA] ??= { [AREA]: {} }
  acc[AREA][AREA][SUPER_REGION] ??= { }
  acc[AREA][AREA][SUPER_REGION][STATE] = null
  return acc;
}, {})

console.log(
  Object.values(grouped)
)

相关问题