请问下大家,这小段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"],
        
    }
]
阅读 1.5k
2 个回答
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;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题