[javascript] 자바 스크립트 배열에서 모든 고유 한 값 가져 오기 (중복 제거)

고유 해야하는 숫자 배열이 있습니다. 인터넷에서 아래 코드 스 니펫을 발견했으며 배열에 0이 될 때까지 훌륭하게 작동합니다. Stack Overflow에서 거의 다른 것처럼 보이는 다른 스크립트를 찾았 지만 실패하지는 않습니다.

그래서 내가 배우는 것을 돕기 위해 누군가가 프로토 타입 스크립트가 잘못되는 것을 결정하도록 도울 수 있습니까?

Array.prototype.getUnique = function() {
 var o = {}, a = [], i, e;
 for (i = 0; e = this[i]; i++) {o[e] = 1};
 for (e in o) {a.push (e)};
 return a;
}

중복 질문에서 더 많은 답변 :

비슷한 질문 :



답변

자바 스크립트 1.6 / 인 ECMAScript 5 당신은 기본 사용할 수있는 filter고유 한 값으로 배열을 얻기 위해 다음과 같은 방법으로 배열의 방법 :

function onlyUnique(value, index, self) {
    return self.indexOf(value) === index;
}

// usage example:
var a = ['a', 1, 'a', 2, '1'];
var unique = a.filter( onlyUnique ); // returns ['a', 1, 2, '1']

네이티브 메소드 filter는 배열을 반복하여 주어진 콜백 함수를 전달하는 항목 만 남겨 둡니다 onlyUnique.

onlyUnique주어진 값이 처음 발생하는지 확인합니다. 그렇지 않은 경우 복제본이어야하며 복사되지 않습니다.

이 솔루션은 jQuery 또는 prototype.js와 같은 추가 라이브러리없이 작동합니다.

혼합 값 유형을 가진 배열에서도 작동합니다.

오래된 브라우저 (<IE9), 즉, 네이티브 메소드를 지원하지 않습니다 filter그리고 indexOf당신을위한 MDN 문서의 작업 방법을 찾을 수 있습니다 필터같이 IndexOf .

마지막으로 나타나는 값을 유지하려면 다음과 같이 간단히 바꾸십시오 indexOf.lastIndexOf .

ES6을 사용하면 다음과 같이 단축 될 수 있습니다.

// usage example:
var myArray = ['a', 1, 'a', 2, '1'];
var unique = myArray.filter((v, i, a) => a.indexOf(v) === i);

// unique is ['a', 1, 2, '1']

Camilo Martin 에게 감사합니다의견에 힌트를 에게 .

ES6에는 Set고유 한 값을 저장 하는 기본 개체 가 있습니다. 고유 한 값을 가진 배열을 얻으려면 다음과 같이하십시오 :

var myArray = ['a', 1, 'a', 2, '1'];

let unique = [...new Set(myArray)];

// unique is ['a', 1, 2, '1']

의 생성자는 SetArray와 같은 반복 가능한 객체 를 가져오고 스프레드 연산자 ...는 집합을 다시 Array로 변환합니다. 의견에 힌트를 준 Lukas Liese 에게 감사드립니다 .


답변

ES6 / ES2015에 대한 업데이트 된 답변 : Set 사용 하면 단일 라인 솔루션은 다음과 같습니다.

var items = [4,5,4,6,3,4,5,2,23,1,4,4,4]
var uniqueItems = Array.from(new Set(items))

어떤 반환

[4, 5, 6, 3, 2, 23, 1]

마찬가지로 le_m이 제안이 또한 사용을 단축 할 수 확산 연산자 처럼

var uniqueItems = [...new Set(items)]


답변

나는이 질문에 이미 30 개 이상의 답변이 있음을 알고 있습니다. 그러나 나는 기존의 모든 대답을 먼저 읽고 내 자신의 연구를했습니다.

나는 모든 대답을 4 가지 가능한 해결책으로 나눕니다.

  1. 새로운 ES6 기능을 사용하십시오. [...new Set( [1, 1, 2] )];
  2. { }중복을 방지하기 위해 객체 를 사용
  3. 헬퍼 배열 사용 [ ]
  4. 사용하다 filter + indexOf

답변에서 찾은 샘플 코드는 다음과 같습니다.

새로운 ES6 기능을 사용하십시오. [...new Set( [1, 1, 2] )];

function uniqueArray0(array) {
  var result = Array.from(new Set(array));
  return result
}

{ }중복을 방지하기 위해 객체 를 사용

function uniqueArray1( ar ) {
  var j = {};

  ar.forEach( function(v) {
    j[v+ '::' + typeof v] = v;
  });

  return Object.keys(j).map(function(v){
    return j[v];
  });
} 

헬퍼 배열 사용 [ ]

function uniqueArray2(arr) {
    var a = [];
    for (var i=0, l=arr.length; i<l; i++)
        if (a.indexOf(arr[i]) === -1 && arr[i] !== '')
            a.push(arr[i]);
    return a;
}

사용하다 filter + indexOf

function uniqueArray3(a) {
  function onlyUnique(value, index, self) {
      return self.indexOf(value) === index;
  }

  // usage
  var unique = a.filter( onlyUnique ); // returns ['a', 1, 2, '1']

  return unique;
}

그리고 어느 것이 더 빠른지 궁금했습니다. 샘플 Google 스프레드 시트를 만들었습니다.기능을 테스트하기 위해 를 . 참고 : ECMA 6은 Google 스프레드 시트에서 사용할 수 없으므로 테스트 할 수 없습니다.

테스트 결과는 다음과 같습니다.
여기에 이미지 설명을 입력하십시오

{ }해시를 사용하기 때문에 객체 를 사용하는 코드 가 승리 할 것으로 예상 했습니다. 테스트 결과 Chrome 및 IE에서이 알고리즘에 대한 최상의 결과를 보여주었습니다. 코드를 위한 @rab에 감사합니다 .


답변

underscore.js를 사용할 수도 있습니다 .

console.log(_.uniq([1, 2, 1, 3, 1, 4]));
<script src="http://underscorejs.org/underscore-min.js"></script>

다음을 반환합니다 :

[1, 2, 3, 4]


답변

하나의 라이너, 순수한 JavaScript

ES6 구문 사용

list = list.filter((x, i, a) => a.indexOf(x) == i)

x --> item in array
i --> index of item
a --> array reference, (in this case "list")

여기에 이미지 설명을 입력하십시오

ES5 구문 사용

list = list.filter(function (x, i, a) {
    return a.indexOf(x) == i;
});

브라우저 호환성 : IE9 +


답변

jQuery를 사용하는 멋진 메소드를 찾았습니다.

arr = $.grep(arr, function(v, k){
    return $.inArray(v ,arr) === k;
});

참고 :이 코드는 Paul Irish의 오리 펀치 포스트 에서 가져 왔습니다 .


답변

ES6를 사용한 최단 솔루션 : [...new Set( [1, 1, 2] )];

또는 원래 질문에서와 같이 Array 프로토 타입을 수정하려는 경우 :

Array.prototype.getUnique = function() {
    return [...new Set( [this] )];
};

EcmaScript 6은 현재 최신 브라우저 (2015 년 8 월) 에서만 일부만 구현 되지만 Babel 은 ES6 (및 ES7)을 ES5로 다시 컴파일하는 데 매우 유명해졌습니다. 그렇게하면 오늘 ES6 코드를 작성할 수 있습니다!

...의미 가 궁금하다면 스프레드 연산자 라고합니다 . From MDN :«확산 연산자를 사용하면 여러 인수 (함수 호출) 또는 여러 요소 (배열 리터럴)가 필요한 위치에서 식을 확장 할 수 있습니다». Set은 반복 가능하고 고유 한 값만 가질 수 있으므로 스프레드 연산자는 Set을 확장하여 배열을 채 웁니다.

ES6 학습을위한 자료 :