将展平的 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)
假设我有以下 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)