>웹 프론트엔드 >JS 튜토리얼 >배열 중복 제거의 JS 구현 예

배열 중복 제거의 JS 구현 예

零下一度
零下一度원래의
2017-07-16 14:52:481385검색

프런트엔드 면접관이 준비해야 할 질문: Javascript에서 배열의 중복을 제거하는 방법. 제가 아는 한, 바이두(Baidu), 텐센트(Tencent), 샨다(Shanda) 등이 인터뷰에서 이런 질문을 한 적이 있습니다. 이 질문은 간단해 보이지만 사실은 숨겨진 위험을 내포하고 있습니다. 이 테스트는 이 기능을 구현하는 것뿐만 아니라 컴퓨터 프로그램 실행에 대한 심층적인 이해에 관한 것입니다.

방법 1:

스플라이스를 사용하여 원본 배열

이중 레이어 루프, 외부 루프 요소, 값 비교

내부 루프의 값이 동일한 경우 이 값을 삭제하세요

참고: 요소를 삭제한 후에는 배열의 길이를 1씩 줄여야 합니다.

Array.prototype.distinct = function (){
  var arr = this,
    i,
    j,
    len = arr.length;
  for(i = 0; i < len; i++){
    for(j = i + 1; j < len; j++){
      if(arr[i] == arr[j]){
        arr.splice(j,1);
        len--;
        j--;
      }
    }
  }
  return arr;
};
var a = [1,2,3,4,5,6,5,3,2,4,56,4,1,2,1,1,1,1,1,1,];
var b = a.distinct();
console.log(b.toString()); //1,2,3,4,5,6,56

장점: 간단하고 이해하기 쉽습니다.

단점: 메모리 사용량이 많고 속도가 느립니다.

방법 2:

외부 루프 요소인 이중 레이어 루프는 내부 ​​루프 동안의 값을 비교합니다

같은 값이 있으면 건너뛰고, 같지 않으면 배열에 밀어 넣습니다

Array.prototype.distinct = function(){
  var arr = this,
    result = [],
    i,
    j,
    len = arr.length;
  for(i = 0; i < len; i++){
    for(j = i + 1; j < len; j++){
      if(arr[i] === arr[j]){
        j = ++i;
      }
    }
    result.push(arr[i]);
  }
  return result;
}
var arra = [1,2,3,4,4,1,1,2,1,1,1];
arra.distinct();       //返回[3,4,2,1]

방법 3: 개체의 속성을 사용하여 중복 항목 제거

Array.prototype.distinct = function (){
  var arr = this,
    i,
    obj = {},
    result = [],
    len = arr.length;
  for(i = 0; i< arr.length; i++){
    if(!obj[arr[i]]){  //如果能查找到,证明数组元素重复了
      obj[arr[i]] = 1;
      result.push(arr[i]);
    }
  }
  return result;
};
var a = [1,2,3,4,5,6,5,3,2,4,56,4,1,2,1,1,1,1,1,1,];
var b = a.distinct();
console.log(b.toString()); //1,2,3,4,5,6,56

방법 4: 배열 재귀중복 항목 제거

재귀적 아이디어 사용

첫 번째 정렬 후 끝부터 비교 만약에 동일한 문제가 발생하면


Array.prototype.distinct = function (){
  var arr = this,
    len = arr.length;
  arr.sort(function(a,b){    //对数组进行排序才能方便比较
    return a - b;
  })
  function loop(index){
    if(index >= 1){
      if(arr[index] === arr[index-1]){
        arr.splice(index,1);
      }
      loop(index - 1);  //递归loop函数进行去重
    }
  }
  loop(len-1);
  return arr;
};
var a = [1,2,3,4,5,6,5,3,2,4,56,4,1,2,1,1,1,1,1,1,56,45,56];
var b = a.distinct();
console.log(b.toString());    //1,2,3,4,5,6,45,56

삭제 방법 5: indexOf 및 forEach


Array.prototype.distinct = function (){
  var arr = this,
    result = [],
    len = arr.length;
  arr.forEach(function(v, i ,arr){    //这里利用map,filter方法也可以实现
    var bool = arr.indexOf(v,i+1);    //从传入参数的下一个索引值开始寻找是否存在重复
    if(bool === -1){
      result.push(v);
    }
  })
  return result;
};
var a = [1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,3,2,3,3,2,2,1,23,1,23,2,3,2,3,2,3];
var b = a.distinct();
console.log(b.toString());  //1,23,2,3

방법 6: ES6의 set

사용

유사한 데이터 구조 설정 배열에 저장되며 해당 구성원의 값은 모두 고유합니다.

Array.from을 사용하여 Set 구조를 배열로 변환


function dedupe(array){
  return Array.from(new Set(array));
}
dedupe([1,1,2,3]) //[1,2,3]

Extendedoperator(...)은 내부적으로 for...of 루프를 사용합니다

let arr = [1,2,3,3];
let resultarr = [...new Set(arr)];  
console.log(resultarr); //[1,2,3]

위 내용은 배열 중복 제거의 JS 구현 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.