js递归解决父子关系问题

在这里插入图片描述
最近碰到的一个需求,记录下。

问题是:如图所示,要给策略六所在行编辑的时候选择一个父策略,父策略下拉框数据要求来自列表授权策略名称列。
限制条件是:不能是自身(这里也就是策略六),授权策略名称所在行的父策略不能是自身,同时要满足继承关系。(比如说:
第三行中策略六是策略一的父策略,第一行中策略一又是策略五的父策略,那么策略五也就不能成为选择项)

将上列表可以转换为流程图:

策略四
策略五
策略一
策略六
策略二
策略七

由上图可以知道策略六所在行的父策略没有选项。因为策略六是所有策略直接或者间接的父策略。

下面用代码实现:

//点击编辑按钮执行getData,row是所在行数据
	getData(row){
	  let self= this;
      let selfName = this.name.; // 编辑行的授权策略名称
      let list = this.checkSystemList; // 列表数组

      // 获取所有策略名称
      let strategyArr= new Set();
      list.map(item => {
        strategyArr.add(item.strategyName);
      });
      strategyArr.delete(selfName);
	  //递归函数
      function filterName(strategyName) {
        // 找出父策略是编辑行授权策略名称的数据
        let filterArr = list.filter(obj => {
          return strategyName === obj.parentStrategyName;
        });
        if (!filterArr.length) {//出口
          //如果编辑行授权策略名称不是任何行的父策略,则所有选项都能选择
          vm.parentData = [...strategyArr];//可选数据
        } else {
          filterArr.map(obj => {
            if (strategyArr.has(obj.strategyName)) {
              strategyArr.delete(obj.strategyName);
            }
            //递归
            filterName(obj.strategyName);
          });
        }
      }
      filterName(selfName);//入口
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值