当前位置: 首页 > 知识库问答 >
问题:

javascript - 麻烦帮忙写个方法,关于多维数组递归问题?

纪成礼
2023-10-11
        const id = 88        const arr = [            {                text: '第一层',                id: 1,                children: [                    {                        text: '第二层',                        id: 2,                        children: [                            {                                text: '第三层',                                id: 88                            }                        ]                    }                ]            },            {                text: '第一层',                id: 3,                children: [                    {                        text: '第二层',                        id: 4,                        children: [                            {                                text: '第三层',                                id: 5                            }                        ]                    }                ]            }        ]        function getIds(id)        // ['1,2,88']

要求写一个方法,匹配上id后,联同祖类所有的id都获取到放到数组返回

共有4个答案

长孙朝明
2023-10-11
function getIds(arr, target) {    let res = []    const state = []    function traverse (state, arr) {        for(let i = 0; i < arr.length; i++) {            const item = arr[i]            if (item.id === target) {                res = [...state, item.id]                break;            }             state.push(item.id)            traverse(state, item.children || [])            state.pop()                    }    }    traverse(state, arr)    return res}console.log(getIds(arr, 88))// [1,2,88]
姬雪松
2023-10-11
    getIds(id, array) {      let idList = []      let targetItem = array.filter(item => JSON.stringify(item).indexOf(`"id":${id}`) != -1)      function getIdList(itemArray) {        itemArray.forEach(item => {          if (item.id === id) {            return idList.push(item.id)          } else {            idList.push(item.id)            if (item.children && item.children.length > 0) {              getIdList(item.children)            }          }        })      }      getIdList(targetItem)      return idList    }

使用:getIds(88,arr)

花俊雄
2023-10-11

需要封装一个递归函数(已去除undefined):

function findPathById(tree, targetId) {    let path = [];    function traverse(node, currentPath) {        if (node.id === targetId) {            path = [...currentPath, node.id];            return true;  // 当找到目标 ID 时返回 true        }        if (node.children) {            for (let child of node.children) {                if (traverse(child, [...currentPath, node.id])) {                    return true;  // 如果在子节点中找到目标 ID,则返回 true                }            }        }        return false;    }    for (let node of tree) {        if (traverse(node, [])) {            break;  // 当找到目标 ID 时停止遍历        }    }    return path;}

传入数组和要查找的id值,如下:
findPathById(arr,88)

杜苏燕
2023-10-11

你可以使用递归函数来解决这个问题。首先,你需要定义一个空数组来存储所有的ID。然后,你可以在每一层查找特定的ID,如果找到,就把这个ID和它的所有祖先的ID添加到数组中。最后,返回这个数组。

以下是实现这个方法的JavaScript代码:

const id = 888;const arr = [...];function getIds(id, array = []) {    // 检查当前id是否存在    if (array.some(a => a === id)) {        // 如果已经存在,直接返回        return array;    }    // 将当前id添加到结果数组中    array.push(id);    // 递归检查所有祖先id    if (id > 1) {        getIds(Math.floor(id / 10), array);    }    return array;}// 调用函数并打印结果console.log(getIds(88)); // ['88', '2', '1']console.log(getIds(5)); // ['5', '4', '3']

这个函数首先检查给定的ID是否已经存在于结果数组中。如果存在,那么就没有必要再次添加。然后,它将当前ID添加到结果数组中。最后,它对每个祖先ID递归调用自己,将它们添加到结果数组中。注意,我们这里假定了你的ID是从1开始的,并且每个ID是它的祖先ID的10倍。如果你的ID生成规则不同,你可能需要修改这个递归调用。

上面的代码将给定的ID和它的所有祖先的ID放在同一个数组中,并按它们在层次结构中的顺序排列。这意味着第一代祖先的ID将出现在数组的开头,而第三代祖先的ID将出现在数组的末尾。

 类似资料: