首页 > 其他分享 >数据扁平化

数据扁平化

时间:2023-03-22 15:55:18浏览次数:30  
标签:const 扁平化 value children flattened 数组 数据 节点

要展平嵌套数组的数组,可以使用flat()方法。此方法创建一个新数组,其中所有子数组元素递归连接到指定深度。 下面是一个例子:

const nestedArr = [1, 2, [3, 4, [5, 6]]];
const flattenedArr = nestedArr.flat(2);
console.log(flattenedArr); // [1, 2, 3, 4, 5, 6]

如果需要用嵌套对象展平对象,可以使用递归函数展平每个嵌套对象,并将它们合并为一个对象。下面是一个例子:

function flattenObject(obj) {
  const flattened = {};
  Object.keys(obj).forEach((key) => {
    if (typeof obj[key] === 'object' && obj[key] !== null) {
      Object.assign(flattened, flattenObject(obj[key]));
    } else {
      flattened[key] = obj[key];
    }
  });
  return flattened;
}

const nestedObj = {
  a: 1,
  b: {
    c: 2,
    d: {
      e: 3,
    },
  },
};

const flattenedObj = flattenObject(nestedObj);
console.log(flattenedObj); // { a: 1, c: 2, e: 3 }

要展平树,可以使用递归函数遍历树,并将每个节点展平为单个数组。下面是一个例子:

以下是flattenTree函数的一个实现,其时间复杂度为O(n):

function flattenTree(node) {
  const flattened = [];
  const stack = [node];
  while (stack.length > 0) {
    const current = stack.pop();
    flattened.push(current.value);
    if (current.children) {
      for (let i = current.children.length - 1; i >= 0; i--) {
        stack.push(current.children[i]);
      }
    }
  }
  return flattened;
}

const tree = {
  value: 1,
  children: [
    {
      value: 2,
      children: [
        {
          value: 3,
          children: [
            {
              value: 4,
            },
          ],
        },
        {
          value: 5,
        },
      ],
    },
    {
      value: 6,
    },
  ],
};

const flattenedTree = flattenTree(tree);
console.log(flattenedTree); // [1, 2, 3, 4, 5, 6]

在这个实现中,flattenTree函数使用堆栈来执行树的深度优先遍历。该函数初始化一个空的扁平数组和一个包含根节点的堆栈。然后,函数进入一个循环,该循环一直持续到堆栈为空。在循环的每次迭代中,函数都会从堆栈中弹出顶部节点,将其值添加到扁平数组中,并按相反的顺序将其子节点推到堆栈上(这样第一个子节点就在堆栈的顶部)。这样可以确保函数以正确的顺序访问节点,以生成扁平阵列。 这种实现的时间复杂度为O(n),其中n是树中节点的总数,因为它只访问每个节点一次,并对每个节点执行恒定的时间操作。

 

使用递归遍历数进行扁平化 O(n)

function flattenTree(node) {
  const flattened = [node.value];
  if (node.children) {
    node.children.forEach((child) => {
      flattened.push(...flattenTree(child));
    });
  }
  return flattened;
}

const tree = {
  value: 1,
  children: [
    {
      value: 2,
      children: [
        {
          value: 3,
          children: [
            {
              value: 4,
            },
          ],
        },
        {
          value: 5,
        },
      ],
    },
    {
      value: 6,
    },
  ],
};

const flattenedTree = flattenTree(tree);
console.log(flattenedTree); // [1, 2, 3, 4, 5, 6]

在本例中,flattenTree函数将节点对象作为输入,并返回一个扁平值数组。函数首先将当前节点的值添加到展平的数组中。如果节点有子节点,函数会在每个子节点上递归调用自己,并使用spread运算符(…)将扁平的子数组扩展到扁平的数组中。最后,函数会返回扁平的数组。

一般来说,递归函数和基于堆栈的迭代函数是最常用的扁平化多维树的方法,因为它们既易于实现,又具有最佳的时间复杂度。然而,方法的选择可能取决于用例的具体要求,例如内存约束或扁平阵列的所需顺序。

标签:const,扁平化,value,children,flattened,数组,数据,节点
From: https://www.cnblogs.com/ximenchuifa/p/17244323.html

相关文章

  • Oracle 数据库 官方下载 安装 及配置监听
    Oracle数据库官方下载安装及配置监听1、Oracle官方下载推荐使用官方下载地址:https://edelivery.oracle.com/osdc/faces/SoftwareDelivery;这是Oracle的一个......
  • 数据分析之营销管理方法论--用户使用行为分析
    用户使用行为1.为什么要做用户使用行为分析?用户行为数据时指在产品内进行各种操作产生的数据。比如:访问、浏览和行为事件。每个访问时间可由多个浏览事件和点击事件构成......
  • spring MVC 中json格式数据发送与接收
    在web程序开发中,前端和服务器数据的传输方式常用的有两种,一种是以表单的形式提交,此时可以利用jquery的serialize()方法将表单内容转为a=1&b=2&c=3&d=4&e=5这样的格式传输过......
  • 数据在内存中的存储---浮点型
    数据在内存中,有intshortchar等等---他们在limit.h中定义而doublefloatlongdouble在float.h中定义  IEEE  S(符号位)E(指数) M(有效数字)      ......
  • 大数据量实时统计排序分页查询(并发数较小时)
    大数据量实时统计排序分页查询的瓶颈不是函数(count,sum等)执行,不是having,也不是orderby,甚至不是表join,导致慢的原因就在于“数据量太大本身” 化整为零就是将表划分为M......
  • MongoDB 数据库部署和应用
    推荐步骤:➢在Centos01上部署MongoDB服务器客户端登录验证➢在Centos01的MongoDB配置文件通过控制文件控制MongoDB服务,配置MongoDB身份验证➢在Centos01......
  • 一种高效的适宜于海量数据排序的算法
    常用的排序算法:  冒泡序,快速排序,直接选择排序,堆排序,希尔排序,归并排序等;无指针分组排序算法  冒泡排序不适宜于逆序  快速排序算法能减少逆序时所消耗的扫描和数......
  • mpi转以太网连接300PLC无需编程与1200PLC数据交换
    300PLC转以太网无需编程300PLC通过NetDevice与1200PLC数据交换应用概述:兴达易控MPI转以太网模块MPI-ETH-XD1.0PLUS通讯模块实现PLC无需编程通过简单的命令配置到模块,实现......
  • 西门子300PLC转以太网无需编程实现与1200PLC转以太网数据交换
    西门子300PLC转以太网无需编程实现与1200PLC转以太网数据通信本文介绍利用兴达易控生产的PLC转以太网模块(MPI-ETH-XD1.0Plus)实现1200/1500PLC与300(CPU315-2DP)PLC无需用......
  • 数据分析之数据分析方法
      常用数据分析方法分类:数据分析方法有很多种,需要根据业务场景中分析目的的不同,选择对应的分析方法,如果你的分析目的是想将复杂的问题变得简单,就可以使用逻辑树分析方......