dependency: function()

in src/framework/MUtil.tsx [329:361]


   dependency: function (fs:MFieldSchema[], all:MFieldSchema[]) {
    // 先建个索引
    const allFieldsIdx = _.keyBy(all, "name");
    
    // 构造未被依赖的集合
    let ndep = _.keyBy(all, "name"); // 全体
    ndep = _.omit(ndep, fs.map(f=>f.name)); // 去掉fs
    
    // 构造被依赖的集合
    let dep = new Map<string, MFieldSchema>();
    fs.forEach(f => dep[f.name] = f);
    
    // 循环从ndep里把被依赖的字段放到dep中,直到dep不再增加
    // 算法有点粗暴,将就用吧
    for(let i = 0; i < all.length; i ++) { //  轮数最多all.length,防止卡死
      let newDepNames = []
      for(let dn in dep) {
        const i = _.intersection( dep[dn].showIf?.split(/[^a-zA-Z0-9_$]/), Object.keys(ndep) );
        newDepNames = newDepNames.concat(i);
      }

      let prevSize = Object.keys(dep).length;
      for(let n of newDepNames){
        dep[n] = allFieldsIdx[n];
        delete  ndep[n];
      }
      let afterSize = Object.keys(dep).length;
      if(prevSize == afterSize) {
        break; // 如果找不到更多依赖,就可以结束了
      }
    }
    return Object.values(dep);
  },