请问下大家,这小段json数据 怎样处理才能转成我想要的这种情况?
[ {
"categoryId": "1850",
"parentId": "1847"
},
{
"categoryId": "1852",
"parentId": "1847"
},
{
"categoryId": "1854",
"parentId": "1847"
},
{
"categoryId": "1893",
"parentId": "1889"
},
{
"categoryId": "1896",
"parentId": "1889"
},
{
"categoryId": "1907",
"parentId": "1902"
},
{
"categoryId": "1909",
"parentId": "1902"
}
]
想找到相同的parentId,去除重复,只保留一个,categoryId则是相同parentId的合集,具体效果是这样的:
[ {
"parentId": "1847",
"categoryId": ["1850","1852","1854"],
},
{
"parentId": "1889"
"categoryId": ["1893","1896"],
},
{
"parentId": "1902"
"categoryId": ["1907","1909"],
}
]
回答:
Object.entries([{
"categoryId": "1850",
"parentId": "1847"
},
{
"categoryId": "1852",
"parentId": "1847"
},
{
"categoryId": "1854",
"parentId": "1847"
},
{
"categoryId": "1893",
"parentId": "1889"
},
{
"categoryId": "1896",
"parentId": "1889"
},
{
"categoryId": "1907",
"parentId": "1902"
},
{
"categoryId": "1909",
"parentId": "1902"
}
].reduce((res, v) => ((res[v.parentId] ||= []).push(v.categoryId), res), {})).map(([parentId, categoryId]) => ({parentId, categoryId}))
回答:
分组之后再做个映射,不用自己写算法,直接用 Lodash
import _ from "lodash";const data = [...];
const result = _(data).groupBy("parentId")
.entries()
.map(([parentId, it]) => ({
parentId,
categoryId: _.map(it, "categoryId")
}))
.value();
console.log(result);
习惯了流式处理数据,所以用了上面的方法,如果看不明白,用循环来解决也可以
function solveByLoops(data) { // 初始化结果集为空数组
const result = [];
for (const it of data) {
// 解构语法,把 parentId 和 categoryId 从 it 里拿出来
const { parentId, categoryId } = it;
// 这里查找已经存在于结果集中的是否有 parentId 相同的
// 如果不明白 find 可以去 MDN 查,也可以自己写循环来查找
let item = result.find(t => t.parentId === parentId);
// 如果没有,产生一个新的,加进去
if (!item) {
item = { parentId, categoryId: [] };
result.push(item);
}
// 不管是找到的,还是新的,都可以直接把 categoryId 加进去
item.categoryId.push(categoryId);
}
return result;
}
以上是 请问下大家,这小段json数据 怎样处理才能转成我想要的这种情况? 的全部内容, 来源链接: utcz.com/p/936428.html