js 数组对象有多层数据,但只保留两层,该如何解决?

新手上路,请多包涵

模拟数据代码贴上:

let nav = [{
        name: "用户中心",
        code: "userManage",
        url: "",
        component: "",
        children: [{
                name: "角色管理",
                code: "userRole",
                url: "",
                component: "",
                children: [{
                    name: "新建",
                    code: "create"
                }]
            },
            {
                name: "用户管理",
                code: "userList",
                url: "",
                component: "",
                children: [{
                    name: "编辑",
                    code: "redact"
                }]
            }
        ]
    },
    {
        name: "系统管理",
        code: "systemManage",
        url: "",
        component: "",
        children: [{
            name: "应用管理",
            code: "system",
            url: "",
            component: "",
            children: [{
                name: "新建",
                code: "create"
            }]
        }]
    }
]

最后要得到的结果:

[{
        name: "用户中心",
        code: "userManage",
        url: "",
        component: "",
        children: [{
                name: "角色管理",
                code: "userRole",
                url: "",
                component: ""
            },
            {
                name: "用户管理",
                code: "userList",
                url: "",
                component: ""
            }
        ]
    },
    {
        name: "系统管理",
        code: "systemManage",
        url: "",
        component: "",
        children: [{
            name: "应用管理",
            code: "system",
            url: "",
            component: ""
        }]
    }
]
阅读 7.2k
6 个回答

因为你这个只有children子属性中存在多层,所以在复制对象时,只处理首层的children子属性,其他层次的都不再处理。

lodash

let nav = [
  {
    name: "用户中心",
    code: "userManage",
    url: "",
    component: "",
    children: [
      {
        name: "角色管理",
        code: "userRole",
        url: "",
        component: "",
        children: [
          {
            name: "新建",
            code: "create",
          },
        ],
      },
      {
        name: "用户管理",
        code: "userList",
        url: "",
        component: "",
        children: [
          {
            name: "编辑",
            code: "redact",
          },
        ],
      },
    ],
  },
  {
    name: "系统管理",
    code: "systemManage",
    url: "",
    component: "",
    children: [
      {
        name: "应用管理",
        code: "system",
        url: "",
        component: "",
        children: [
          {
            name: "新建",
            code: "create",
          },
        ],
      },
    ],
  },
];
const _ = require('lodash')
function filter(arr) {
  let result = _.cloneDeepWith(arr);
  for (let firstLayer of result) {
    if (firstLayer.children) {
      for (let secondLayer of firstLayer.children) {
        delete secondLayer.children;
      }
    }
  }
  return result;
}
let result = filter(nav);
console.log("result",result[0].children[0]);
console.log("原数据",nav[0].children[0]);

image

const fn = (data, limited = 1) =>
    data.map(({ children, ...rest }) =>
        ({
            ...rest,
            ...(limited === 2 ? {} : { children: fn(children, limited + 1) })
        })
    );
const result = nav.map(item => {
    const children = item.children.map(every => {
        return {
            name: every.name,
            code: every.code,
            url: every.url,
            component: every.component,
        };
    })
    return {
        ...item,
        children: children
    };
})

demo 链接


  const res = nav.map((v) => {
     v.children = v.children.map((c) => {
       Reflect.deleteProperty(c, 'children')
       return c
     })
     return v
  })
新手上路,请多包涵

用normalizr库 把多层嵌套解构转换成扁平式结构 下面是使用方法
image.png
地址:normalizr

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题