js克隆一个对象和递归

function deepClone(target, object) {

    for (let k in object) {

        if (typeof object[k] === 'object') {

            target[k] = {};

            deepClone(target[k], object[k]);

        } else {

            target[k] = object[k];

        }

    }

}

// 测试用例

let obj = {

    a: 1,

    b: [1, 2, 3],

    c: {}

};

let emptyObj ={};

deepClone(emptyObj, obj);

emptyObj['a']=10;

console.log("目标对象::",emptyObj);

console.log("原对象",obj);

今天同事在做一个树形结构数据,需要过滤掉数组中不合法的项。具体示例如下面代码中的 json 结构,需要过滤到所有 isFolder 值为0的项。

第一次写居然错了,只导出最下面一层,晚上自己琢磨了一下改了改,用是可以用了,但是注释部分自己都有点不太明白。

简单做个记录,以后有时间再研究一下递归函数。
 

/**

 * 过滤数组不合法项

 * @param {Array} arr 传入目标数组

 * @returns 过滤后的数组

 * ?不是常规的递归函数,但是结果是正常的。

 */

 let recurData = (arr) => {

    // 用一个变量来记录传入数组当前层次过滤后的集合。

    let tempArr = arr.filter(item => !!item.isFolder)

    // 循环遍历,有children的项,并递归

    for (let item of tempArr) {

      if (item.children && item.children.length) {

        // 这里是关键,相当于是修改当前层次的children,递归以后就不会影响上一层的数据而且永远是修改的下一层的数据。

        item.children = recurData(item.children)

      }

    }

    // 这里导出第一次过滤后的数据,但是for循环是同步运行的,所以只有递归结束以后才会触发return,当数据量大时性能会下降。

    return tempArr

  }

  let json = [

    {

      id: 1, isFolder: 1, children: [

        { id: '1-2', isFolder: 0 },

        { id: '1-3', isFolder: 1 },

        {

          id: '1-4', isFolder: 1,

          children: [

            { id: '1-4-1', isFolder: 1 },

            { id: '1-4-2', isFolder: 0 },

            { id: '1-4-3', isFolder: 1 },

            { id: '1-4-4', isFolder: 0, }

          ]

        },

      ]

    },

    { id: 2, isFolder: 0 },

    { id: 3, isFolder: 1 },

    { id: 4, isFolder: 0 },

    { id: 5, isFolder: 1 },

  ]

  let result = recurData(json)

  console.log(JSON.stringify(result))

  //[{"id":1,"isFolder":1,"children":[{"id":"1-3","isFolder":1},{"id":"1-4","isFolder":1,"children":[{"id":"1-1-1","isFolder":1},{"id":"1-1-3","isFolder":1}]}]},{"id":3,"isFolder":1},{"id":5,"isFolder":1}]


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值