请问下大家,这小段json数据 怎样处理才能转成我想要的这种情况?

请问下大家,这小段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

回到顶部