第7章迭代器模式

2017-10-09  本文已影响0人  入秋未凉的海

第7章迭代器模式

7.1 jQuery中的迭代器

$.each([1,2,3],function(){
    console.log('当前下标为'+i);
    console.log('当前值为'+n);
})

7.2 实现自己的迭代器

var each = function(ary,callback){
    for(var i=0,l=ary.length;i<l;i++){
        callback.call(ary[i],i,ary[i]);
    }
};

each([1,2,3],function(i,n){
    alert([i,n]);
});

7.3 内部迭代和外部迭代

1内部迭代器

内部已经定义好了迭代规则

var compare = function(arr1,arr2){
    if(arr1.length!==arr2.length){
        throw new Error('arr1和arr2不相等');
    }
    each(arr1,function(i.n){
        if(n!==arr2[i]){
            throw new Error('arr1和arr2不相等');
        }
    })
    alert('arr1和arr2相等');
}

compare([1,2,3],[1,2,4]);

2外部迭代器

外部迭代器必须显式地请求迭代下一个元素

外部迭代器增加了一些调用的复杂度,但相对也增强了迭代器的灵活性,可以手工控制迭代的过程或者顺序

var Iterator = function(obj){
    var current = 0;

    var next = function(){
        current+=1;
    }
    var isDone = function(){
        return current>=obj.length;
    }
    var getCurrItem = function(){
        return obj[current];
    }
    return {
        next:next,
        isDone:isDone,
        getCurrItem:getCurrItem
    }
}

var compare = function(iterator1,iterator2){
    while(!iterator1.isDone()&&!iterator2.isDone()){
         if(iterator1.getCurrItem()!==iterator2.getCurrItem()){
            throw new Error('iterator1和iterator2不相等');
         }
         iterator1.next();
         iterator2.next();
    }
    alert('iterator1和iterator2相等');

}

var iterator1 = Iterator([1,2,3]);
var iterator2 = Iterator([1,2,3]);

compare(iterator1,iterator2);

7.4 迭代类数组对象和字面量对象

类数组对象:比如arguments,{'0':'a','1':'b'}等

for in语句可以迭代普通字面量对象的属性

jQuery中提供了$.each函数封装各种迭代行为:

$.each = function(){
    var value,
        i = 0,
        length = obj.length,
        isArray = isArraylike(obj);
        if(isArray){//迭代类数组
            for(;i<length;i++){
                value = callback.call(obj[i],i,obj[i]);
                if(value===false){
                    break;
                }
            }
        }else{
            for(i in obj){
                value = callback.call(obj[i],i,obj[i]);
                if(value === false){
                    break;
                }
            }
        }
    return obj;
};

7.5 倒序迭代器

var reverseEach = function(arr,callback){
    for(var l = arr.length-1;l>=0;l--){
        callback(l,arr[l]);
    }
}
reverseEach([0,1,2],function(i,n){
    console.log(n);
});

7.6 中止迭代器

var each = function(ary,callback){
    for(var i = 0, l = ary.length; i < l; i++){
        if(callback(i,ary[i])===false){
            break;
        }
    }
};
each([1,2,3,4,5],function(i,n){
    if( n > 3 ){
        return false;
    }
    console.log(n);
})

7.7 迭代器模式的应用举例

上一篇 下一篇

猜你喜欢

热点阅读