標籤:function 遍曆數組 [] length log 相等 rip 索引 否則
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 var n = []; 3 for (var i = 0, length = arr.length; i < length; i++) { 4 //如果當前數組的第i項在當前數組中第一次出現的位置和最後一次出現的位置是否相等 5 if ( arr.indexOf( arr[i] ) === arr.lastIndexOf( arr[i] ) ) { 6 n.push( arr[i] ); 7 }; 8 }; 9 return n;10 }
(5)利用數組的排序方法,先排序,利用排序後的數組特性,亦即相同值的元素相鄰,來判斷是否重複。
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)基於數組排序:
第五種,先對數組排序,利用排序後,相同值數組元素相鄰的特性,判斷元素是否重複。
JavaScript tips:數組去重