배열 작업을 수행 할 때는 종종 복제를 제거하는 문제가 발생합니다. 다음은 배열 중복 제거 방법에 대한 간략한 소개입니다.
중복 제거의 지수
array.prototype.unique1 = function () {var arr = []; for (var i = 0; i <this.length; i ++) {var item = this [i]; if (arr.indexof (item) === -1) {arr.push (item);}} return arr;} [1,2,3, '4', 3,3,1, 1, 1). // [1, 2, 3, "4", 4, "34"]그러나 IE6-8 하에서 배열의 인덱스가 아직 존재하지 않습니다 (이것은 약간 오래된 주제 O (∩_∩) o ~)이지만 프로그래머는 indexof method를 작성해야합니다.
var indexof = [] .indexof? function (arr, item) {return arr.indexof (item);} : 함수 indexof (arr, item) {for (var i = 0; i <arr.length; i ++) {if (arr [i] === item) {return i;}} return -1;} array.prototype.unique2 = function () {var i =; i. {var item = this [i]; if (Ar // [1, 2, 3, "4", 4, "34"]indexof는 이러한 재구성 방식을 사용할 수도 있습니다.
Array.prototype.unique3 = function () {var arr = [this [0]]; for (var i = 1; i <this.length; i ++) {if (this.indexof (this [i]) == i) {arr.push (this [i]);}} return arr;} [1,2,3, '4', 3,4,3,1, '34 ', 2] .unique3 (); // [1, 2, 3, "4", 4, "34"]다시로드 할 해시
위의 indexof는 정확하지만 성능면에서 이중주기는 성능을 줄입니다. 그런 다음 해시를 사용합니다.
array.prototype.unique4 = function () {var arr = []; var hash = {}; for (var i = 0; i <this.length; i ++) {var item = this [i]; var key = typeof (항목)+itemif (hash [key]! == 1) {arr.push (항목); hash [hash] = 1; arr;} [1,2,3, '4', 3,4,3,1, '34 ', 2] .unique4 (); // [1, 2, 3, "4", 4, "34"]핵심은 indexof를 대체하기 위해 해시 객체를 구축하는 것입니다. 공간을 때로 변경하십시오. JavaScript에서 객체의 키 값은 문자열 일 수 있습니다 (물론 ES6은 맵 데이터 구조를 제공합니다. 객체와 유사하며 키 값 쌍의 모음이지만 "키"의 범위는 문자열에만 국한되지 않습니다. 모든 유형의 값 (객체 포함)은 키로 간주 될 수 있습니다. 이는 더 완전한 해시 구조 표현입니다.), var key = typeof (Item) + 값을 값 1과 문자열 '1'을 구별하려면 항목이 필요합니다.
그런 다음 '4'와 4가 동일하게 간주되기를 원한다면 (다른 접근법은 동일합니다)
array.prototype.unique5 = function () {var arr = []; var hash = {}; for (var i = 0, len = this.length; i <len; i ++) {if (! hash [this [i])) {arr.push (this [i]); hash [this [i] = true;}} return arr;} [1,2,3, '4', 3,4,3,1, '34 ', 2] .unique5 (); // [1, 2, 3, "4", "34"]정렬 후, de-Repeat
Array.prototype.unique6 = function () {this.sort (); var arr = [this [0]]; for (var i = 1; i <this.length; i ++) {if (this [i]! == arr [arr.length-1]) {arr.push (this [i]);} return return arr;} [1,2,3, '4', 3,4,3,1, '34 ', 2] .unique6 (); // [1, 2, 3, "34", "4", 4]먼저 배열을 정렬 한 다음 두 개의 인접한 값을 비교하십시오. 정렬 할 때는 JS 기본 정렬 방법을 사용하므로 매우 빠릅니다. 이 방법에는 한 가지 단점이 있습니다. 문자를 비교할 때는 문자 인코딩 순서대로 정렬됩니다. 따라서 10은 2에서 처음으로 순위가 매겨 지지만 무거운 중량 제거에는 영향을 미치지 않습니다. 그러나 일종의 문제를 해결하기 위해 정렬 메소드는 매개 변수를 수용합니다. 이는 메소드입니다.
함수 비교 (value1, value2) {if (value1 <value2) {return -1;} else if (value1> value2) {return 1;} else {return 0;}} [1,2,5,2,10,3,20] .sort (compare); // [1, 2, 2, 3, 5, 10, 20]다시로드하도록 설정합니다
ES6은 새로운 데이터 구조 세트를 제공합니다. 배열과 유사하지만 멤버의 값은 모두 중복 값없이 고유합니다. 브라우저는 이제 완전히 지원되며 서버 노드도 지원됩니다.
array.prototype.unique7 = function () {return array.from (new set (this));} [1,2,3, '4', 3,4,3,1, '34 ', 2] .unique7 (); // [1, 2, 3, "4", 4, "34"]방법 라이브러리
노드 또는 브라우저 js에서 매우 인기있는 메소드 라이브러리 컬스.
const _ = require ( 'alderscore'); _. uniq ([1, 2, 1, 3, 1, 4]; // [1, 2, 3, 4]
테스트 시간
위의 모든 방법을 간단한 방식으로 테스트 한 다음 가장 좋은 방법을 비교하고 선택할 수 있습니다.
Console.Time ( "Test"); [1,2,3, '4', 3,4,3,1, '34 ', 2] .unique7 (); Console.Timeend ( "Test"); ==> VM314 : 3 Test : 0.378ms
데이터를 더 크게 만들려면 1 백만 개의 숫자를 무작위로 만듭니다.
var arr = []; var num = 0; for (var i = 0; i <10000000; i ++) {num = math.floor (math.random ()*100); arr.push (num);} console.time ( "test"); arr.unique7 (); console.timeend ( "test");위의 것은 편집자가 중간에서 단순까지 느리게 소개 한 JavaScript 배열 중복 제거입니다. 나는 그것이 당신에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!