将展平的 JSON 动态分组到嵌套的 JSON 对象中

Dynamically group flattened JSON into nested JSON object

假设我有以下 JSON 数组:

[
    {
        "MainCategory": "1",
        "SubCategory": "a",
        "Value": "val1"
    },
    {
        "MainCategory": "1",
        "SubCategory": "a",
        "Value": "val2"
    },
    {
        "MainCategory": "1",
        "SubCategory": "b",
        "Value": "val3"
    },
    {
        "MainCategory": "2",
        "SubCategory": "a",
        "Value": "val4"
    },
    {
        "MainCategory": "2",
        "SubCategory": "b",
        "Value": "val5"
    },
    {
        "MainCategory": "2",
        "SubCategory": "b",
        "Value": "val6"
    }
]

并希望将其转换为 JavaScript(无 Lodash)中的以下多维对象:

{
    "1":{
        "a": [
            "val1",
            "val2"
        ],
        "b": [
            "val3"
        ]
    },
    "2":{
        "a": [
            "val4"
        ],
        "b": [
            "val5",
            "val6"
        ]
    }
}

我想我可以用 foreach 来做到这一点,但我正在尝试使用 reduce 函数来做到这一点(希望这是在这里使用的正确函数)但没有得到正确的语法。

我目前的 GUESS(不工作)是这样的:

const newJson = CurrentJson.reduce((result, {MainCategory, SubCategory, Value}) => {
    (result[MainCategory][SubCategory] = result[MainCategory][SubCategory] || [])
    .push(Value);

    return result;
}, {});

我该怎么做?

您可以按如下方式使用reduce;

var data = [ { "MainCategory": "1"
             , "SubCategory": "a"
             , "Value": "val1"
             }
           , { "MainCategory": "1"
             , "SubCategory": "a"
             , "Value": "val2"
             }
           , { "MainCategory": "1"
             , "SubCategory": "b"
             , "Value": "val3"
             }
           , { "MainCategory": "2"
             , "SubCategory": "a"
             , "Value": "val4"
             }
           , { "MainCategory": "2"
             , "SubCategory": "b"
             , "Value": "val5"
             }
           , { "MainCategory": "2"
             , "SubCategory": "b"
             , "Value": "val6"
             }
           ],
   res  = data.reduce((r,o) => ( r[o.MainCategory] ? r[o.MainCategory][o.SubCategory] ? r[o.MainCategory][o.SubCategory].push(o.Value)
                                                                                      : r[o.MainCategory][o.SubCategory] = [o.Value]
                                                   : r[o.MainCategory] = {[o.SubCategory]: [o.Value]}
                               , r
                               ) ,{});
  console.log(res);

您可以使用缩减器迭代原始对象 JSON 并构建新对象。

const json = [
    {
        "MainCategory": "1",
        "SubCategory": "a",
        "Value": "val1"
    },
    {
        "MainCategory": "1",
        "SubCategory": "a",
        "Value": "val2"
    },
    {
        "MainCategory": "1",
        "SubCategory": "b",
        "Value": "val3"
    },
    {
        "MainCategory": "2",
        "SubCategory": "a",
        "Value": "val4"
    },
    {
        "MainCategory": "2",
        "SubCategory": "b",
        "Value": "val5"
    },
    {
        "MainCategory": "2",
        "SubCategory": "b",
        "Value": "val6"
    }
]

const newJson = json.reduce((prev, curr) => {
  // Check for the MainCategory first
  if (prev[curr.MainCategory] === undefined) {
    prev[curr.MainCategory] = {
      [curr.SubCategory]: [] // Add the SubCategory key and define as empty array
    }
  }
  
  // Check if we have the SubCategory
  if (prev[curr.MainCategory][curr.SubCategory] === undefined) {
    prev[curr.MainCategory][curr.SubCategory] = [] // define as empty array
  }

  // Push the Value
  prev[curr.MainCategory][curr.SubCategory].push(curr.Value)
  
  return prev
}, {})

console.log(newJson)