树形数据结构转换?

已知树

const list = [
  {
    "id": "111",
    "text": "父节点1",
    "children": [
          {
            "id": "12",
            "text": "子节点1"
          },
          {
            "id": "14",
            "text": "子节点2"
          },
          {
            "id": "15",
            "text": "子节点3"
          }, 
    ]
  },
  {
    "id": "222",
    "text": "父节点2",
    "children": [
          {
            "id": "12",
            "text": "子节点11"
          },
          {
            "id": "144",
            "text": "子节点22"
          },
          {
            "id": "155",
            "text": "子节点33"
          }, 
    ]
  }
]

根据数组[12,14,144];
想要的数据结构

[['111',12],['222',12],['222',14],['222',144]]

不用for循环写

阅读 1.5k
2 个回答

这样?

const filter = new Set(['12', '14', '144']);

list.reduce((a, {id, children: c}) => a.concat(c.filter(i => filter.has(i.id)).map(i => [id, i.id])), [])
function getParentIdGroup(param, target) {
  const newTarget = target.reduce((res, item) => {
    const newItemChildren = item.children.reduce((newChildren, cur) => {
      cur.parentId = item.id;
      newChildren.push({ ...cur })
      return newChildren;
    }, []);
    res.push(...newItemChildren);
    return res;
  }, []);

  return newTarget.reduce((_, cur) => {
    const paramChild = param.find(id => id === cur.id);
    if (paramChild) {
      _.push([ cur.parentId, cur.id ]);
    }
    return _;
  }, []);
}

console.log(getParentIdGroup(["12", "14", "144"], list));

image.png

顺带提一句,为什么不把 parentId 给 children 的每一项,会省很多事儿

补充回答一下 @无名 的问题,不用两层循环

const list = [
  {parentId: "111", id: "12", text: "子节点1"},
  {parentId: "111", id: "14", text: "子节点2"},
  {parentId: "111", id: "15", text: "子节点3"},
  {parentId: "222", id: "12", text: "子节点3"},
  {parentId: "222", id: "144", text: "子节点3"},
  {parentId: "222", id: "155", text: "子节点3"},
]
const param = ["12", "14", "144"];

function getParentIdGroup(param, target) {
  const flatTarget = target.reduce((_, cur) => {
   if (_[cur.id]) {
     _[cur.id].push([cur.parentId, cur.id]);
   } else {
     _[cur.id] = [[ cur.parentId, cur.id ]]
   }
    return _;
  }, {});
  console.log(flatTarget);
  /************* 
   {
    '12': [ [ '111', '12' ], [ '222', '12' ] ],
    '14': [ [ '111', '14' ] ],
    '15': [ [ '111', '15' ] ],
    '144': [ [ '222', '144' ] ],
    '155': [ [ '222', '155' ] ]
  }
  *************/
  return param.reduce((_, cur) => {
    const item = flatTarget[cur];
    if (item) {
      _.push(...item)
    }
    return _;
  }, []);
}

console.log(getParentIdGroup(param, list));

image.png

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