炫意html5
最早CSS3和HTML5移动技术网站之一

vue/react/js for循环及map方法代码精简问题

原始data↓

data: [{
id: '1',
label: '1',
sort: 1,
children: [{ pid: null, label: '1-1', sort: null }, { pid: null, label: '1-2', sort: null },]
}, {
id: '2', label: '2', sort: 2,
children: [{ pid: null, label: '2-1', sort: null }, { pid: null, label: '2-2', sort: null },]
}]

理想↓

        [{ id: '1', label: '1', sort: 1 },
{ pid: '1', label: '1-1', sort: 0 },
{ pid: '1', label: '1-2', sort: 1 },
{ id: '2', label: '2', sort: 2 },
{ pid: '2', label: '2-1', sort: 0 },
{ pid: '2', label: '2-2', sort: 1 }]

假设有这样一个data,我需要把children提取出来与外面那层同级,然后去除children,也就是说我需要整个data只有一级只有一层,然后这里面children里的pid要等于父级的id。
sort排序从0开始,比如label为“1”的父级底下的children里有两条数据,这两条children里的sort从0开始到1。
同样的,如果同时另外一个label为“2”的父级底下的children里有两条数据,他这两条children里的sort也是从0开始到1。

ps:data中的其他key、value不可动,要保留住,例如label

现在的代码↓

for (const i in data) {
if (!data[i].children || data[i].children.length == 0) {
data[i].pid = ""
data[i].sort = i
}
}
let b = data.flatMap(i => {
i.children.map((j, index) => { j.pid = i.id; j.sort = index; j.menuType = 0 });
let a = i.children; delete i.children; a.unshift(i);
return a
});
console.log(b)

现在的代码可以完成上诉需求,但是我觉得太复杂了想优化或者精简,比如说把上面的for循环放在下面的“let b”里面,所以请教下各位该怎么写

在这里先谢谢各位大神们的解答了,小弟感激不尽!

回答

const data = [
      {
        id: "1",
        label: "1",
        sort: 1,
        children: [
          { pid: null, label: "1-1", sort: null },
          { pid: null, label: "1-2", sort: null }
        ]
      },
      {
        id: "2",
        label: "2",
        sort: 2,
        children: [
          { pid: null, label: "2-1", sort: null },
          { pid: null, label: "2-2", sort: null }
        ]
      }
    ];
    const result = data.reduce((a, b) => {
      const func = obj => {
        let res = [obj];
        if (obj.children)
          res = [
            ...res,
            ...obj.children.map((item, i) => ({
              ...item,
              pid: obj.id,
              sort: i
            }))
          ];
        return res;
      };
      return Array.isArray(a) ? [...a, ...func(b)] : func(b);
    }, {});
    console.log(result);

深度优先遍历

炫意HTML5 » vue/react/js for循环及map方法代码精简问题

CSS3教程HTML5教程