js技巧-获取任意树节点数据时仅保留最顶级父级节点

我的树节点获取后大体长这样:

[
	{"id": "1_1""text": "1级节点1","children": [...]},
	{"id": "1_1_1","text": "2级节点1","children": [...]},
	{"id": "1_1_2","text": "2级节点2"},
	{"id": "2_1","text": "1级节点2","children": [...]},
	{"id": "2_1_1","text": "2级节点2"}
	...
]

就是取数时,父节点与子节点全部拿到了。因为某种需求,我不需要所有勾选的节点数据,而是如果某个节点的子节点全部勾选,只要父节点就行。

先说思路吧:

1、遍历一遍数据arr:
(1)所有节点存储在键值对temp对象中(以id为键,以节点数据为值);
(2)有children字段的保留,没有children的从原数组中删除

2、遍历处理后的数据arr(此时的每一项都是有children的)
循环arr每一项的children列表,比如item为node,如果temp中有node的id,那么删除该键

3、最后遍历temp中剩余的键值对,就是最后要获取的顶级父节点数据

下面是代码:

// 存放节点数据的键值对
const temp = {};

// 遍历arr,生成键值对及过滤非末级节点
for (let i = 0; i < arr.length; i++) {
    const node = arr[i];
    temp[node.id] = node;
    if (!node.children) {
        arr.splice(i, 1);
        i--;
    }
}

// 遍历过滤后的arr,把有每一个节点的children节点都从键值对中删除
for (let j=0; j<arr.length; j++) {
    const children = arr[i].children;
    for (let k=0; k< children.length; k++) {
        if(temp.hasOwnProperty(children[k]["id"])) {
            delete temp[childNodes[k]["id"]];
		}
	}
}

// 最后留下的,就是要的顶级节点数据
let result = Object.keys(temp);
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

众秒之门

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值