【发布时间】:2020-05-03 21:40:56
【问题描述】:
请看一下我当前的 json。我想按这个递归分组。
[{ "mode": "AR", "fname": "ta", "lname": "da", "w_lng":
"1.23", "w_lat": "2.23","other":"a"},
{ "mode": "AR", "fname": "ta", "lname": "Dash", "w_lng":
"1.23", "w_lat": "2.23","other":"b" },
{ "mode": "AR1", "fname": "ka", "lname": "ja", "w_lng":
"3.23", "w_lat": "4.23","other":"c" },
{ "mode": "AR", "fname": "Kiran", "lname": "Dash", "w_lng":
"5.23", "w_lat": "6.23","other":"d" },
{ "mode": "AR", "fname": "Milan", "lname": "Dash", "w_lng":
"7.23", "w_lat": "8.23","other":"e" },
{ "mode": "AR1", "fname": "ka", "lname": "ja", "w_lng":
"8.23", "w_lat": "9.23","other":"f" }]
我在寻找什么:
{
"mode": "AR",
"results": [
{
"fname": "ta",
"lname": "da",
"w_level": [
{ "w_lng": "1.23",
"w_lat": "2.23"
"other":[{"other":"a","other":"b"}]
},
{"w_lng": "3.xx",
"w_lat": "4.xx"
"....":[........]
}
]
}
{
"fname": "ka",
"lame": "ja",
"w_level": [
{
"w_lng": "6.xx",
"w_lat": "5.xx"
.....................
}
]
}
]
},
{
"mode": "AR1",
"results": [
{
"fname": "ka",
"lname": "ja",
"w_level": [
{ "w_lng": "6.xx",
"w_lat": "5.xx"
"....":[........]
}
]
}
]
}
我尝试过的:
Object.values(inArr.reduce((item, currItem) => {
var { mode, fname, lname } = currItem;
if (!item[mode]) item[mode] = { mode, results: [] };
let w_level = {};
for (let key of Object.keys(currItem)) {
if (key !== "fname" && key !== 'lname' && key !== 'mode') {
w_level[key] = currItem[key];
}
}
item[mode].results.push({fname: fname, lname: lname, w_level: [w_level]});
return item;
}, {}))
但问题是 fname 和 lname 再次,即使它是相同的。我想递归分组。首先它将按模式分组。然后在此模式下按 fname+lname 分组。如果有任何相同,它将像树一样添加。
【问题讨论】:
-
建议的结果是不可能的;您不能在对象中有重复的键。你能更新它以澄清你的意图吗?
-
当我通过连接从表中获取数据时,就会出现这个 json。想想像按国家分组,然后按城市分组,然后按病房分组等等......
-
对不起,我觉得我说得不够清楚。在您的结果中,您需要一个像这样的对象:
{"fname": "ka", "fname": "ja"}。这样的对象是不可能的——试试吧。 -
@ggorlen 这可能只是一个错字,我相信 OP 的意思是
lname。不过还是不错的。 -
毫无疑问,但是与输出中的
...省略号一起,使得它变得不那么清晰了。我认为 OP 会通过显示完全正确的输出来为自己提供服务,以避免任何混淆或歧义。
标签: javascript arrays node.js json reduce