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

yizhihongxing

当需要将树形结构进行转换时,可以采用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日

相关文章

  • JavaScript复制变量三种方法实例详解

    JavaScript复制变量三种方法实例详解 在JavaScript中,想要复制变量可能需要了解一些技巧。本文将详细讲解JavaScript中复制变量的三种方法。 1. 直接赋值 最常用的方法就是直接将变量赋值给另一个变量。 let a = 1; let b = a; 这里,变量a的值被赋给了新变量b。 如果您更改 b 的值,a 的值仍然保持不变。 实例如下…

    node js 2023年6月8日
    00
  • Moment.js 不容错过的超棒Javascript日期处理类库

    当今,Javascript是开发应用和网站的核心语言之一。一般情况下,用来对日期进行处理的Javascript内置函数并不够全面和强大。在这种情况下,Moment.js的出现为我们提供了一个强大、灵活和简单的解答。 Moment.js是一个高度可靠的Javascript日期处理类库,可用来解析和展示、验证、处理和操作日期。在这篇文章中,我们将探讨如何使用Mo…

    node js 2023年6月8日
    00
  • 使用 NodeJS+Express 开发服务端的简单介绍

    下面就是使用 NodeJS+Express 开发服务端的简单攻略。 简介 NodeJS 是一种运行在服务器端的 JavaScript 运行环境,它允许开发者使用 JavaScript 编写后端服务。而 Express 是 NodeJS 应用最广泛的web应用程序框架之一,它提供了一些简洁的方法来处理 http 请求、路由等任务。使用 NodeJS+Expre…

    node js 2023年6月8日
    00
  • javascript中的107个基础知识收集整理 推荐

    JavaScript基础知识收集整理攻略 概述 近年来,JavaScript在Web领域的应用越来越广泛,成为Web开发人员必备技能之一。为了帮助大家更好地学习JavaScript,本攻略汇总总结了107个JavaScript基础知识,包括变量、数据类型、数组、函数、对象等,从而帮助初学者更好地掌握JavaScript编程。 变量 变量的定义 变量是存储数据…

    node js 2023年6月8日
    00
  • JS实现可控制的进度条

    JS实现可控制的进度条,可以使用CSS和JS相结合的方法来实现。下面是一些基本的步骤和代码示例,让我们一起来学习吧! 步骤 HTML结构:首先需要在HTML中创建进度条的基本结构,可以使用div元素来表示进度条,设置一个进度条容器。如下所示: <div id="progress-container"> <div id=&…

    node js 2023年6月8日
    00
  • Node.js中的http请求客户端示例(request client)

    当我们需要在Node.js中向其他服务器发送HTTP请求时,可以使用内置的HTTP模块提供的客户端功能,也可以使用第三方模块request。 下面是使用request模块发送HTTP请求的示例代码: 首先需要在项目中引入request模块: const request = require(‘request’); 然后,我们可以使用request模块的requ…

    node js 2023年6月8日
    00
  • nodejs环境快速操作mysql数据库的方法详解

    Node.js 环境快速操作 MySQL 数据库的方法详解 在 Node.js 环境下,使用 MySQL 数据库是非常普遍的,这里提供一份快速操作 MySQL 数据库的攻略。 安装 mysql 模块 首先需要安装 mysql 模块,可以使用 npm 安装: npm install mysql 连接 MySQL 数据库 使用 mysql 模块连接 MySQL …

    node js 2023年6月8日
    00
  • 如何使用puppet替换文件中的string

    使用puppet替换文件中的string,可以通过file_line和replace两个puppet的资源来实现。 file_line资源替换指定行的内容 file_line可以用来替换指定文件中的一行内容。具体的使用方式为: file_line { ‘description’: path => ‘/path/to/file’, line => …

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