最近有一段事件是在做TDD测试,我觉得难点就是去重问题,现提供几个方法及自己的理解。
第一种方法:
var arr = [1, 2, 2, 3, 4, 5, 6, 6]; function getArray(a) { var hash = {}, len = a.length, result = []; for (var i = 0; i < len; i++){ if (!hash[a[i]]){ hash[a[i]] = true; result.push(a[i]); } } return result; } getArray(arr); // 输出[1, 2, 3, 4, 5, 6]
这样的做法其实就是在遍历 给出数组 的元素时在一个hash中给每一个出现过的元素做一个标志,进而做出判断改元素是否存在,然后去重的目的。这是一种值得学习的方法
第二种方法:
var array = []; var length = new_array.length; for(var i = 0;i < length; i++){ for(var j = i+1; j < length; j++){ if(new_array[i] === new_array[j] ){ j = ++i; } } array.push(new_array[i]); } return array;
这个就比较的难理解了,精华在与 j = ++i;这句话,这个是你拿第一个元素和第二个元素起一一做比较但是,当遇到不同的时候就push到array,同时以不同的那个元素为标准,接着和后面的比,以此类推。这种方法不提倡,别人难以看懂。
第三种方法:自己的方法
for (var n = 0, len = result.length; n < len; n++) { if (k.name == result[n].name) { result[n].summary += k.summary; } else if(k.name !== result[n].name && n == len -1){ result.push(k); } }
重要是
else if(k.name !== result[n].name && n == len -1)
这句话,它的意思是当k.name不和result中的每一个元素不相等,直到最后一个都不相等,
n == len -1
这个样写的原因就是你每次push到result的时候result的length是一直在变的,这样就避免了长度定值问题。
综合上述三种方法就简单好理解的是第三种,但我推荐大家学习第一种,主要学的是那种思想和那种处理问题的角度。