前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >针对js对象和数组的深度迭代器

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

作者头像
theanarkh
发布2019-03-06 10:06:28
1.2K0
发布2019-03-06 10:06:28
举报
文章被收录于专栏:原创分享原创分享
代码语言:javascript
复制
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)
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-02-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程杂技 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档