JavaScript实现树结构转换的五种方法总结

当需要将树形结构进行转换时,可以采用JavaScript进行处理。下面介绍JavaScript实现树结构转换的五种方法总结。

方法一:递归法

递归法是常用的处理树形结构的方式。将树形结构节点递归展开,然后通过JS数组的push方法进行数据填充。

function treeArray(tree) {
  var arr = [];
  tree.forEach(function(node) {
    var obj = {
      id: node.id,
      name: node.name
    };
    if (node.children && node.children.length > 0) {
      obj.children = treeArray(node.children);
    }
    arr.push(obj);
  });
  return arr;
}

// 示例

var tree = [{
  id: 1,
  name: 'Node1',
  children: [{
      id: 2,
      name: 'Child1'
    },
    {
      id: 3,
      name: 'Child2'
    }
  ]
}];

var result = treeArray(tree);
console.log(result); // 输出结果:[{id: 1, name: 'Node1', children: [{id: 2, name: 'Child1'}, {id: 3, name: 'Child2'}]}]

方法二:广度优先遍历

广度优先遍历的过程中,借助了队列实现。遍历树形结构,将节点塞入队列中,并不断输出队列头节点,并将其子节点加入队列中。

function broadTraversal(tree) {
  var arr = [],
    queue = [];
  if (tree && tree.length > 0) {
    queue = queue.concat(tree);
  }
  while (queue.length > 0) {
    var out = queue.shift(),
      obj = {
        id: out.id,
        name: out.name
      };
    if (out.children && out.children.length > 0) {
      obj.children = out.children;
      queue = queue.concat(out.children);
    }
    arr.push(obj);
  }
  return arr;
}

// 示例

var tree = [{
  id: 1,
  name: 'Node1',
  children: [{
      id: 2,
      name: 'Child1'
    },
    {
      id: 3,
      name: 'Child2'
    }
  ]
}];

var result = broadTraversal(tree);
console.log(result); // 输出结果:[{id: 1, name: 'Node1', children: [{id: 2, name: 'Child1'}, {id: 3, name: 'Child2'}]}]

方法三:深度优先遍历

深度优先遍历的过程中,借助了递归实现。遍历树形结构,将节点按深度递归展开,然后逐一输出。

function depthTraversal(tree) {
  var arr = [];

  function recursive(current) {
    if (current) {
      var obj = {
        id: current.id,
        name: current.name
      };
      if (current.children && current.children.length > 0) {
        obj.children = [];
        for (var i = 0; i < current.children.length; i++) {
          obj.children.push(recursive(current.children[i]));
        }
      }
      return obj;
    }
  }

  if (tree && tree.length > 0) {
    for (var j = 0; j < tree.length; j++) {
      arr.push(recursive(tree[j]));
    }
  }
  return arr;
}

// 示例

var tree = [{
  id: 1,
  name: 'Node1',
  children: [{
      id: 2,
      name: 'Child1'
    },
    {
      id: 3,
      name: 'Child2'
    }
  ]
}];

var result = depthTraversal(tree);
console.log(result); // 输出结果:[{id: 1, name: 'Node1', children: [{id: 2, name: 'Child1'}, {id: 3, name: 'Child2'}]}]

方法四:扩展运算符

扩展运算符是ES6语法中的一种运算符。可以将...表达式作为运算符,在数组和对象一级元素作用下进行拆分。

function expandOperators(tree) {
  var arr = [];
  tree.forEach(function(node) {
    var obj = {
      id: node.id,
      name: node.name
    };
    if (node.children && node.children.length > 0) {
      obj.children = [...expandOperators(node.children)];
    }
    arr.push(obj);
  });
  return arr;
}

// 示例

var tree = [{
  id: 1,
  name: 'Node1',
  children: [{
      id: 2,
      name: 'Child1'
    },
    {
      id: 3,
      name: 'Child2'
    }
  ]
}];

var result = expandOperators(tree);
console.log(result); // 输出结果:[{id: 1, name: 'Node1', children: [{id: 2, name: 'Child1'}, {id: 3, name: 'Child2'}]}]

方法五:reduce方法

reduce方法是ES5语法中的一种数组方法。在数组元素遍历的过程中,将当前元素与上一次返回的结果进行计算,最终返回一个计算完成的结果。

function reduceTree(tree) {
  function recursive(current) {
    var obj = {
      id: current.id,
      name: current.name
    };
    if (current.children && current.children.length > 0) {
      obj.children = current.children.reduce(function(prev, cur) {
        prev.push(recursive(cur));
        return prev;
      }, []);
    }
    return obj;
  }
  return recursive(tree[0]);
}

// 示例

var tree = [{
  id: 1,
  name: 'Node1',
  children: [{
      id: 2,
      name: 'Child1'
    },
    {
      id: 3,
      name: 'Child2'
    }
  ]
}];

var result = reduceTree(tree);
console.log(result); // 输出结果:{id: 1, name: 'Node1', children: [{id: 2, name: 'Child1'}, {id: 3, name: 'Child2'}]}

以上是JavaScript实现树结构转换的五种方法总结,能够帮助开发者更好的处理树形结构数据,提升开发效率。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript实现树结构转换的五种方法总结 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • 详解本地Vue项目请求本地Node.js服务器的配置方法

    下面是详解本地Vue项目请求本地Node.js服务器的配置方法的完整攻略。 环境准备 在开始本地Vue项目请求本地Node.js服务器的配置之前,需要先完成以下环境准备: 安装Node.js,确保版本高于8.0 安装Vue CLI,用于快速搭建Vue项目 步骤一:创建后端服务 首先,需要通过Node.js创建一个本地的后端服务。可以通过Express框架来实…

    node js 2023年6月8日
    00
  • node连接mysql查询事务处理的实现

    在实现 Node.js 连接 MySQL 数据库的过程中,事务处理是一个非常重要的内容。通过使用事务,可以保证一组 SQL 操作的原子性以及一致性。下面是基本的实现步骤: 1.安装 MySQL 模块 npm install mysql –save 2.导入 mysql 模块 const mysql = require(‘mysql’); 3.连接 MySQ…

    node js 2023年6月8日
    00
  • JavaScript实现微信红包算法及问题解决方法

    JavaScript实现微信红包算法及问题解决方法 算法原理: 微信红包发放的本质就是将总金额随机分配给领取红包的人,每个人获得的金额不同,但总金额不变。那么实现红包算法,需要遵循以下原则: 每个人领取的红包金额随机,但总金额一定。 每个红包金额的范围应该在可接受的范围内。 每个红包金额不能少于最小值,也不能超过最大值。 需要保障每个人都能领取到红包,不能有…

    node js 2023年6月8日
    00
  • NodeJS实现阿里大鱼短信通知发送

    下面我来详细讲解使用NodeJS实现阿里大鱼短信通知发送的完整攻略: 安装依赖 首先,需要在本地安装aliyun-sdk依赖包。可以通过npm进行安装,命令如下: npm install aliyun-sdk –save 获取短信模板ID 在阿里云控制台中创建短信签名和短信模板,并获取其对应的短信模板ID。这里以验证码短信为例,模板内容为: 您的验证码为:…

    node js 2023年6月8日
    00
  • nodejs之koa2请求示例(GET,POST)

    下面是针对 “nodejs之koa2请求示例(GET,POST)” 这个主题的完整攻略。 概述 Koa2 是一个 Node.js 的框架,可以帮助开发者快速、更容易地构建 Web 应用程序和 API。本文将讲解使用 Koa2 进行 GET 和 POST 请求的示例。 请求分类 一般来说,我们的请求主要分为以下两种: GET 请求:获取信息,由于数据在 URL…

    node js 2023年6月8日
    00
  • node.js编译生成错误提示fatal error LNK1112/1123的解决方法

    Node.js编译生成错误提示fatal error LNK1112/1123的解决方法 什么是LNK1112/1123错误 在使用Node.js编译时,有时会遇到以下错误提示: LINK: fatal error LNK1112: module machine type ‘x64’ conflicts with target machine type ‘X…

    node js 2023年6月8日
    00
  • 安装@vue/cli报错npmERR gyp ERR问题及解决

    当我们在安装@vue/cli时,可能会遇到以下报错信息: npm ERR! gyp ERR! build error npm ERR! gyp ERR! stack Error: make failed with exit code: 2 npm ERR! gyp ERR! stack at ChildProcess.onExit (/usr/local/l…

    node js 2023年6月8日
    00
  • npm报错:无法将”npm”项识别为cmdlet、函数、脚本文件或可运行程序的名称

    当我们在使用npm命令时,有时可能会遇到以下报错: 无法将"npm"项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。 这个错误是因为电脑没有安装npm或npm没有配置到环境变量中所致。 以下是解决这个问题的方法: 方法一:安装Node.js npm是随Node.js一…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部