算法:数组去重
1、实现目标:数组去重
2、实现思路:
(1)创建新数组。
(2)遍历原数组,判断当前被遍历元素是否存在于新数组,如果存在于新数组,则判断当前被遍历元素是重复的;如果不存在于新数组,则判断当前被遍历元素不是重复的,则将其压入新数组。
(3)遍历完毕原数组后,返回新数组。
3、具体实现:根据对当前元素是否重复的判断方法不同,有四种不同的具体实现。
(1)利用hash表保存被遍历元素是否重复的状态。
1 function unique( arr ) { 2 var n = {}, //hash表,用于判断元素是否已经压入新数组 3 r = []; 4 for (var i = 0, length = arr.length; i < length; i++) { 5 // 如果当前元素已经被压入新数组,hash表中的值则为true,据此判断其是否重复 6 if ( !n[ arr[i] ] ) { 7 n[ arr[i] ] = true; 8 r.push( arr[i] ); 9 }; 10 }; 11 return r; 12 };
(2)利用indexOf方法,判断当前被遍历元素是否在新数组中。
1 function unique( arr ) { 2 var n = []; 3 for (var i = 0, length = arr.length; i < length; i++) { 4 if ( n.indexOf( arr[i] ) === -1 ) { 5 n.push( arr[i] ); 6 }; 7 } 8 return n; 9 };
(3)利用当前被遍历元素在原数组第一次出现的位置与其索引是否相等判断是否重复。
1 function unique( arr ) { 2 var n = []; 3 for (var i = 0, length = arr.length; i < length; i++) { 4 //如果当前数组的第i项在当前数组中第一次出现的位置不是i,那么表示第i项是重复的,忽略掉。否则存入新数组 5 if ( arr.indexOf( arr[i] ) === i ) { 6 n.push( arr[i] ); 7 }; 8 }; 9 return n; 10 };
(4)利用数组的排序方法,先排序,利用排序后的数组特性,亦即相同值的元素相邻,来判断是否重复。
1 function unique( arr ) { 2 arr.sort(); 3 var r = []; 4 for (var i = 1, length = arr.length; i < length; i++) { 5 if ( arr[i] !== arr[i - 1] ) { 6 r.push( arr[i] ); 7 }; 8 }; 9 return r; 10 };
4、小结:
(1)基于数组位置:
第二种,从当前元素是否出现在新数组中判断是否重复;
第三种,根据当前元素第一次出现的位置和当前被遍历元素下标是否相等判断是否重复;
(2)基于数组分布:
第一种,建hash表,保存数组元素的分布状态,遍历数组时,根据分布状态判断是否重复;
(3)基于数组排序:
第四种,先对数组排序,利用排序后,相同值数组元素相邻的特性,判断元素是否重复。