用哈希表去数组重复项,有详细注释

这个我不懂,男朋友给我讲了一遍,我还是不太明白,于是自己带入实例一个一个理了一遍,写上了很详细的注释,如果有人能看到,并且和我一样不太理解,希望看到这个就都能懂哈,哎学习中的菜鸟伤不起~

var countArr = [1, 2, 1];
function unique(arr) {
    var resultArr = [],
        hash = {}; //定义返回的数组,和哈希表
    for (var i = 0, elem;
    (elem = arr[i]) != null; i++) {
        //for循环第一句话:定义i=0,和elem两个变量
        //for循环第二句话:把arr[i]的值赋给elem,判断elem的值是否为空
        //①当i=0,第一次循环,elem=arr[0]=1,所以不为null,进入循环内部
        //②当i=1,第二次循环,elem=arr[1]=2,所以不为null,进入循环内部
        //③当i=2,第三次循环,elem=arr[2]=1,所以不为null,进入循环内部
        if (!hash[elem]) {
            //①这时elem=1,if(!hash[1])由于这时hash={},所以hash[1]没有值为false,!hash[1]就为true,执行if内部语句
            //②这时elem=2,if(!hash[2])由于这时hash={1:true},所以hash[2]没有值为false,!hash[2]就为true,执行if内部语句
            //③这时elem=1,if(!hash[1])由于这时hash={1:true,2:true},所以hash[1]有值为true,!hash[1]就为false,不执行if内部语句
            resultArr.push(elem);
            //①resultArr=[1]
            //②resultArr=[1,2]
            //不执行第三次
            hash[elem] = true;
            //①hash={1:true}
            //②hash={1:true,2:true}
            //不执行第三次
        };
    };
    return resultArr;
}
document.write(unique(countArr));

 

posted @ 2015-11-06 10:36  Mu薇  阅读(617)  评论(2编辑  收藏  举报