递归系列——数组和对象的相关递归

 递归是函数调用自身,而函数又是可复用的代码封装。
 那么递归必然每次都是进行相同的处理逻辑。
 递归会使原先的大问题变小,变小后的问题还用“相同的逻辑”来处理。

  说到“相同的逻辑”,不由得让人会想到数组和对象。
  因为数组中的元素可以是数组,
  对象中的属性值也可以是对象。
  那么对嵌套的数组和嵌套的对象的遍历,必然需要使用递归。

  1.遍历嵌套数组

   

          function visit(array,fn){
            if(Array.isArray(array)){
                return array.forEach(function(v){
                    visit(v,fn);
                })
            }else{
                fn(array);
            }
        }
        var array = [1,2,[3,4],[5,[6,7]]];
        visit(array,function(v){ //输出数组的成员
            console.log(v); //1,2,3,4,5,6,7
        }) 
        var result = [];
        visit(array,function(v){
            v%2 == 0 && result.push(v);
        })
        console.log(result);// 2 4 6

     其实,此时真正需求是:
     如果能把嵌套数组“展平”变成一维数组,那岂不是想用什么API,就用什么了。

    展平函数也需要使用递归:

 1 function flatten(array, result) {
 2     !result && (result = []);
 3     for (var i = 0; i < array.length; i++) {
 4         if (Array.isArray(array[i])) {
 5             flatten(array[i], result);
 6         } else {
 7             result.push(array[i]);
 8         }
 9     }
10     return result;
11 }
12 var array = [1, 2, [3, 4], [5, [6, 7]]];
13 console.log( flatten(array) );  //输出:  [1, 2, 3, 4, 5, 6, 7]
 
 

  2.嵌套对象的遍历

  对象的深拷贝就是其中应用之一。

 

 

 

  3.对象的值相等比较操作。

  

function equal(a, b) {
    // 三等,自然值就相等
    if (a === b) return true;
    // 要求类型一致
    var className = {}.toString.call(a);
    if (className !== {}.toString.call(b)) return false;

    // 如果是数组
    if (Array.isArray(a)) {
        var length = a.length;
        if (length !== b.length) return false;
        while(length--) {
            if (!equal(a[length], b[length])) return false;
        }
    } else if (typeof a == 'object'){ // 如果是对象
        var keys = Object.keys(a);
        var length = keys.length;
        if (length != Object.keys(b).length) return false;
        while(length--) {
            var key = keys[length];
            if (!(key in b) || !equal(a[key], b[key])) return false;
        }
    } else { // 基本类型
        return a == b;
    }
    return true;
}
console.log( equal(1, 1) );
console.log( equal([1, 2], [1, 2]) );

var a = [1, 2, [3, 4], [5, [6, 7]]];
var b = [1, 2, [3, 4], [5, [6, 7]]];
console.log( equal(a, b) );

var c = { x : [1, 2, 3], y : { z: { w: 1}}, t: 2};
var d = { x : [1, 2, 3], y : { z: { w: 1}}, t: 2};
console.log( equal(c, d) );

输出结果:

 

 

 

 

转载于:https://www.cnblogs.com/xuzhudong/p/7443506.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值