根据搜索值返回新的树(Vue版)


帮同事解决的需求,根据搜索值返回有搜索值的树结构

searchTreeData (originTreeData, searchValue) {
      if (!searchValue) {
        this.$set(this, 'dataDepartSet', originTreeData);
        return;
      }
      const treeData = JSON.parse(JSON.stringify(originTreeData));
      const searhTree = Array.from({ length: treeData.length });
      function changeTreeBySearch (data, key) {
        data.forEach((e, index) => {
          const treeIndex = key ? `${key}-${index}` : String(index);
          if (~e.title.indexOf(searchValue)) {
            const indexs = treeIndex.split('-');
            let count = 0;
            changeSearchTree(searhTree, treeData);
            function changeSearchTree (item, originItem) {
              const searchIndex = indexs[count];
              console.log(item, originItem, indexs, searchIndex, 8787);
              if (!item[searchIndex]) {
                item[searchIndex] = {
                  title: originItem[searchIndex].title,
                  expand: true
                };
                if (originItem[searchIndex].children) {
                  item[searchIndex].children = Array.from({ length: originItem[searchIndex].children.length });
                }
              }
              ++count;
              if (item[searchIndex].children && item[searchIndex].children.length && indexs.length > count) {
                changeSearchTree(item[searchIndex].children, originItem[searchIndex].children);
              }
            }
          }
          e.children && changeTreeBySearch(e.children, treeIndex);
        });
      }
      changeTreeBySearch(treeData);
      function dfsClearUndefined (data, key) {
        for (let i = data.length - 1; i >= 0; --i) {
          if (!data[i]) {
            data.splice(i, 1);
          } else {
            data[i].children && dfsClearUndefined(data[i].children);
          }
        }
      }
      dfsClearUndefined(searhTree);
      this.$set(this, 'dataDepartSet', JSON.parse(JSON.stringify(searhTree)));
    }

面试深信服写的搜索树

function filter (tree, str) {
  const newTree = [];
  tree.forEach(val => {
    if (~val.name.indexOf(str)) {
      newTree.push(val)
    } else {
     const children = filter(val.children || [], str)
     if (children.length) {
       newTree.push({ ...val, children })
     }
    }
  }) 
  return newTree;
}
posted @ 2020-08-01 14:12  代码男孩  阅读(484)  评论(0编辑  收藏  举报