记录一下 javascript 的一些方法

计算嵌套对象层级的深度

我有这样一个对象,长得像佟丽娅,哈哈哈哈,做梦笑醒。

重来!

长得是这个样子:

{
    children: [
        {
            children: [
                {
                    children:[

                    ]
                },{
                    children:[

                    ]
                }
            ]
        },{
            children: [
                {
                    children:[
                        
                    ]
                }
            ]
        },{
            children: [
                {
                    children:[
                        
                    ]
                }
            ]
        }
    ]
}

嗯,是不是很熟悉!
哈哈哈哈,就是绘制树状图的数据。

需求是树状图超过屏幕长度的时候,我要动态计算树状图节点间距,
所以,我需要知道节点深度,也就是最长分支上有多少个间隔。
比如最长分支上有12个节点,这里就有11个间隔,巴拉巴拉

我的代码如下

function reduce (o, depth, array) {
  if (o.children && o.children.length) {
    for (let item of o.children) {
      array.push(1 + depth)
      if (item.children) {
        reduce(item, 1 + depth, array)
      }
    }
  } else {
    array.push(1 + depth)
  }
  return Math.max.apply(null, array)
}
let depth = reduce(source, 0, [])
对象深复制

同样,这个需求是由于 D3 绘制树状图引入的

同样的数据,又要用表格展示,又要用树状图展示

嗯。。。安排!

首先,将后端返回的扁平数据结构转换成树状图需要的结构

const dataSet = d3.stratify()
      .id(d => d.id)
      .parentId(d => d.pid)(nodeList)

然后,拷贝 dataset ,并改变其中的层级,使之可以方便的渲染在 table 结构中

const data = [dataSet].map(ergodicList)
function ergodicList (item) {
  let d = item.data
  let obj = {
    label: d.name,
    description: d.description,
    info: d.info,
    state: d.state,
    type: d.type,
    pid: d.pid,
    id: d.id
  }
  if (item.children && item.children.length) {
    obj['children'] = copyChildren(item.children)
  }
  return obj
}
// 拆成两个函数是为了方便阅读理解
function copyChildren (list) {
  return list.map(ergodicList)
}

如果有更好方法,欢迎交流。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 递归是一种编程技巧,其中一个函数调用自身。在 JavaScript 中,递归方法可以用来解决复杂的问题,并使代码更简洁易读。 递归的基本模型包括以下几个步骤: 1. 定义递归终止条件:当递归达到一定的深度时,必须终止递归。 2. 分治:将问题分解为规模更小的子问题。 3. 调用自身:通过解决子问题来解决整个问题。 4. 记录结果:在递归的过程中,记录每一步的结果。 下面是一个简单的递归例子,计算阶乘: ``` function factorial(n) { if (n === 0) { return 1; } return n * factorial(n - 1); } ``` 在这个例子中,递归终止条件是 `n` 为 0,分治的子问题是计算 `n-1` 的阶乘,调用自身的方式是通过函数 `factorial` 调用,并将计算结果返回。 ### 回答2: 递归是一种在编程中常见的技巧,特别在JavaScript中,递归方法经常被用来解决问题。递归是指一个函数调用自身的过程。下面是关于JavaScript递归方法的一些重要信息: 1. 递归方法必须包含一个终止条件,否则函数将无限地调用自身。这个终止条件通常是某个特定条件的判断,一旦满足了该条件,递归将停止。 2. 递归方法必须能够将问题分解为更小的子问题,同时保持问题的解决方案是相同的。 3. 递归方法可以方便地解决一些复杂的问题,例如树和图的遍历,阶乘计算等。 4. 使用递归方法时需要小心,因为它可能会导致性能问题。递归过程中使用大量的函数调用,可能导致堆栈溢出。 5. 尽管递归方法可以让代码更简洁和易于理解,但在某些情况下,使用循环可能更高效和可维护。因此,在选择使用递归方法之前,需要仔细权衡。 总的来说,JavaScript的递归方法是一种强大而灵活的编程技巧,可以解决各种问题。但在使用时需要注意终止条件和性能问题,以确保代码的正确性和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值