고유 해야하는 숫자 배열이 있습니다. 인터넷에서 아래 코드 스 니펫을 발견했으며 배열에 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']
의 생성자는 Set
Array와 같은 반복 가능한 객체 를 가져오고 스프레드 연산자 ...
는 집합을 다시 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 가지 가능한 해결책으로 나눕니다.
- 새로운 ES6 기능을 사용하십시오.
[...new Set( [1, 1, 2] )];
{ }
중복을 방지하기 위해 객체 를 사용- 헬퍼 배열 사용
[ ]
- 사용하다
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 학습을위한 자료 :