多维数组遍历获取所有id

目前遇到一个问题,要获取多维数组里面的所有id,数组维度又不确定,虽然最多5层,但循环写起来太臃肿,递归算法也不太熟

var arr = [
    {
      id: 1,
      type: '',
      children: [
          {
              id: 2,
              type: '',
              children: [
                  {
                      id: 3,
                      type: '',
                      children: [
                          {
                              id: 4,
                              type: '',
                              children: [...]
                          }
                      ]
                  }
              ]
          }
      ]
    }
]

如何获取arr里面所有的id

阅读 6.8k
6 个回答
function setArr(arr, newArr) {
    newArr = newArr || [];
    arr.forEach(item => {
        (item.id || item.id == 0) && newArr.push(item.id);
        item.children && setArr(item.children, newArr);
    })
    return newArr;
}

有两种方式,递归是最正常的做法。

当然有一种取巧一点的,可以把整个数组 stringify ,然后用正则匹配获取所有的 id。

function getId(arr, newArr) {
                newArr = newArr || []
                for (let i = 0; i < arr.length; i++) {
                    const item = arr[i];
                    if (item["id"]) {
                        newArr.push(item["id"])
                        if (item["children"]) {
                            getId(item["children"], newArr)
                        }
                    }
                }
                return newArr
            }

可以试试闭包

<?php   
$result = array_filter($arr, function ($var) {     
  $found = false;  
  array_walk_recursive($var, function ($item, $key) use (&$found) {    
    $found = $found || $key == "s";  
  });  
  return $found;  
});  

var_dump($result);
 var arr = [{
        id: 1,
        type: '',
        children: [{
            id: 2,
            type: '',
            children: [{
                id: 3,
                type: '',
                children: [{
                    id: 4,
                    type: '',
                    children: []
                }]
            }]
        }]
    }]

    function getIds(arr, result = []) {
        arr.forEach(item => {
            result.push(item.id)
            if (item.children.length) {
                return getIds(item.children, result)
            }
        })
        return result
    }
    console.log(getIds(arr))
let idList = []
let arrBak = arr.concat()

while (arr.length) {
    let item = arr.shift()
    idList.push(item.id)
    arr = arr.concat(item.children)
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题