微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用两个参数创建一个函数来查找节点是否存在?

如何解决如何使用两个参数创建一个函数来查找节点是否存在?

我不知道是否有类似的方法:对象或映射来检查嵌套对象。

我遇到的问题是我在其他对象中有对象。 :/

我认为代码应该更深: node.children[1].children[0].children[0].children[0].name;

但我无法以这种方式创建递归函数

    const rootNode = {
        name: "node1",children: [
            {
                name: "node2",children: [
                    {
                        name: "node3",tag: 251,},]
            },{
                name: "node4",children: [
                    {
                        name: 'node5',children: [
                            {
                                name: "node7",children: [
                                    {
                                        name: 'node8',children: [
                                            {
                                                name: "node6"
                                            },],]
    }
    
    // YOU CAN MODIFY THIS PART ONLY
    /**
     * Search a node by name inside a node
     * @param node Any node to start the search in
     * @param nodeName The name to search
     * @returns undefined when no node is found or the founded node
     */
    const searchInNodeByName = (node,nodeName) => {
    
    
    }
    // HERE ENDS WHAT YOU CAN MODIFY
    
    const valueIsRecord = (value) => value !== null
        && typeof value === 'object'
        && !Array.isArray(value)
    
    const node6 = searchInNodeByName(rootNode,'node6')
    
    if (
        node6 === undefined
        || !valueIsRecord(node6)
        || node6.name !== 'node6'
    ) {
        throw new Error('node6 should be found')
    }
    
    const node10 = searchInNodeByName(rootNode,'node10')
    
    if (node10 !== undefined) {
        throw new Error('node10 should not be found')
    }
    
    const node3 = searchInNodeByName(rootNode,'node3')
    
    if (
        node3 === undefined
        || !valueIsRecord(node3)
        || node3.name !== 'node3'
        || node3.tag !== 251
    ) {
        throw new Error('node3 should be found')
    }
    
    console.log('IF YOU SEE THIS ON YOUR CONSOLE,YOU ARE DONE!')

解决方法

const searchInNodeByName = (node,nodeName) => {
  if (node['name'] == nodeName) {
    return node;
  }
  else if (node['children'] != undefined) {
    for (let i = 0; i < node['children'].length; i++) {
      var checkChild = searchInNodeByName(node['children'][i],nodeName);
      if (checkChild !== undefined) {
        return checkChild;
      }
    }
  }
  return undefined;
}

此函数将检查给定的第一个节点,如果名称等于 nodeName 参数,则返回该节点。否则,如果该节点中有子节点,它将遍历所有子节点,并执行递归函数到达节点参数内的所有节点,优先处理节点对象。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。