针对js对象和数组的深度迭代器

1,支持嵌套对象,数组或者混合的形式。
2,逐个元素进行迭代。
3,也支持非深度迭代。
可在这个思路上进行拓展其他类型函数。
“`
var utils = {};
utils.isObject = function(obj) {
return Object.prototype.toString.call(obj) === ‘[object Object]’;
}

utils.isArray  = function(arr) {
    return Object.prototype.toString.call(arr) === '[object Array]';
}

utils.flatten =function(arg,overwrite) {
    if (utils.isArray(arg)) {
        return utils.flattenArray(arg);
    }
    else if(utils.isObject(arg)){
        return utils.flattenObject(arg,overwrite);
    } else {
        return [arg];
    }
}

utils.flattenArray = function(arr) {
    var result = [];
    var len = arr.length;
    var index = 0;
    var position = 0;
    for (;index<len;index++) {
        var value = arr[index];
        if (utils.isArray(value)) {
            var tmp = utils.flattenArray(value);
            var _len = tmp.length;
            var _index = 0;
            while (_index<_len) {
                result[position++] = tmp[_index++];
            }
        }
        else{
            result[position++] = value;//utils.isObject(value) ? JSON.stringify(value) : value;
        }
    }
    return result;
}

utils.flattenObject = function(obj, overwrite) { //键值越前越深就可能会被后面的覆盖
    if (!utils.isObject(obj)) {
        return;
    }
    var keys = Object.keys(obj);
    var len = keys.length;
    var result = {};
    for (var index = 0; index < len; index++) {
        var value = obj[keys[index]];
        if (utils.isObject(value)) {
            var ret = utils.flatten(value, overwrite);
            var _keys = Object.keys(ret);
            var _len = _keys.length;
            for (var _index = 0; _index < _len; _index++) {
                var _key = _keys[_index];
                (result[_key] && !overwrite) || (result[_key] = ret[_key]);
            }
        } else {
            (result[keys[index]] && !overwrite) || (result[keys[index]] = value);
        }
    }
    return result;
}
/*
    arg: array|object
    fun: callback
    context: this
    deepExtend: true|false (extend the )
*/
utils.iterate = function(arg,fun,context,deepExtend) {
    if (utils.isArray(arg)) {
        var result = utils.flatten(arg);
        for (var index = 0; index< result.length;index++) {
            if (deepExtend && utils.isObject(result[index])) {
                if (utils.iterate(result[index],fun,context,deepExtend) === false) {
                    return false;
                }
            }
            else if (fun.call(context,result[index],index,result) === false) {
                return false;
            }
        }
    } else if (utils.isObject(arg)) {
        for (var key in arg) {
            if (hasOwnProperty.call(arg,key)) {
                if (utils.isObject(arg[key])) {
                    if (utils.iterate(arg[key],fun,context) === false) {
                        return false;
                    }
                } else if (deepExtend && utils.isArray(arg[key])){
                    if (utils.iterate(arg[key],fun,context,deepExtend) === false) {
                        return false;
                    }
                } 
                else {
                    if (fun.call(context,arg[key],key,arg) === false) {
                        return false;
                    }
                }
            }
        }
    }
}

utils.iterate({hello:’world’},function(value,index,obj) {
console.log(value,index)
},null)

utils.iterate([1,2,3],function(value,index,obj) {
console.log(value,index)
},null)

utils.iterate({hello:[1,2,3]},function(value,index,obj) {
console.log(value,index)
},null,false)

utils.iterate({hello:[1,2,3]},function(value,index,obj) {
console.log(value,index)
},null,true)

utils.iterate([1,2,[3],{a:4,b:5}],function(value,index,obj) {
console.log(value,index)
},null,false)

utils.iterate([1,2,[3],{a:4,b:5}],function(value,index,obj) {
console.log(value,index)
},null,true)

utils.iterate({hello:[{a:1},2,3]},function(value,index,obj) {
console.log(value,index)
},null,true)

utils.iterate([1,2,3],function(value,index,obj) {
console.log(value,index)
if (value === 1) return false;
},null,true)
“`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值