树状数组取出ID为3的项,方法越简单越好,求解

const floor = [
  {
    id: 1,
    text: '一层',
    children: [
      {
        id: 2,
        text: '二层',
        children: [
          {
            id: 3,
            text: '三层',
            children: [
              {
                id: 4,
                text: '四层'
              }
            ]
          }
        ]
      }
    ]
  }
];
阅读 5.3k
8 个回答
let result = null;

const findItemById = (id, list = floor) => {
  list.some(e => {
      if (e.id === id) {
          result = e;
          return true;
      } else {
          if (e.children) {
            result = findItemById(id, e.children);
            if (result) {
              return true;
            } else {
              return false;
            }
          }
      }
  })
  return result;
}

console.log(findItemById(3))

看数据很有规律偷个懒

        function getId(id, obj = floor) {
            for (let i = 1; i < id; i++) {
                obj = obj[0]["children"]
            }
            return obj[0]
        }
        console.log(getId(3))
function getId (floor, id) {
  for (const val of floor) {
    return val.id === id ? val : val.children ? getId(val.children, id) : false
  }
  return false
}

console.log(getId(floor, 3))

用递归 简单易懂 支持无限极嵌套

const floor = [
  {
    id: 1,
    text: '一层',
    children: [
      {
        id: 2,
        text: '二层',
        children: [
          {
            id: 3,
            text: '三层',
            children: [
              {
                id: 4,
                text: '四层'
              }
            ]
          }
        ]
      }
    ]
  }
];
const getById = (list, id) =>{
    for(let i = 0; i < list.length; i++) {
        if(list[i].id === id){
            return list[i]
        }else {
            if(list[i].children){
                return getById(list[i].children, id)
            }
        }
    }
}

console.log(getById(floor, 3))
function findValue (arr) {
  return arr[0].id === 3 ? arr[0] : findValue(arr[0].children)
}
console.log(findValue(floor))
function getNodeById(nodes, id) {
    let result;
    if(nodes && nodes.length) {
        for(let i = 0, len = nodes.length; i < len; i++) {
             let node = nodes[i];
             /*
             if(node.id === id) {
                 result = node;
                 break;
             }else {
                 result = getNodeById(node.children, id);
                 if(result) break;
             }
             */
             result = node.id === id ? node : getNodeById(node.children, id);
             if(result) break;
        }
    }
    return result;
}

很简单,递归就完事了:

function func (floor) {
    if (floor[0] && floor[0].children && floor[0].children[0].id === 3) {
       return floor[0].children
    }
    return func(floor[0].children)
}

暂时只想到了递归,
返回项内删除了 child 内部的 child


function find(arr,id){
    if(!arr){
        return null;
    }
    let result=[];
    function run(array_item){
        array_item.forEach(item=>{
            if(item.id===id){
                var new_item = ({...item});//创建新对象 不影响原对象
                delete new_item.children;//删除children,无需返回
                result.push(new_item);
            }
            item.children&&run(item.children);
        })
    }

    run(arr);

    return result;
}

clipboard.png

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