JavaScript에 중복이 포함 된 배열에서 고유 한 값의 배열을 얻는 방법은 무엇입니까?
이 질문에는 이미 답변이 있습니다.
['0','1','1','2','3','3','3']
배열이 주어지면 결과는이어야합니다 ['0','1','2','3']
.
편집
ES6 솔루션 :
[...new Set(a)];
대안 :
Array.from(new Set(a));
오래된 응답. O (n ^ 2) (큰 배열에는 사용하지 마십시오!)
var arrayUnique = function(a) {
return a.reduce(function(p, c) {
if (p.indexOf(c) < 0) p.push(c);
return p;
}, []);
};
주문을 유지하려면 다음을 수행하십시오.
arr = arr.reverse().filter(function (e, i, arr) {
return arr.indexOf(e, i+1) === -1;
}).reverse();
내장 역 인덱스가 없기 때문에 배열을 반전시키고 중복을 필터링 한 다음 다시 반전시킵니다.
필터 함수는 현재 색인 이후 (원래 배열에서) 요소의 발생을 찾습니다. 발견되면이 요소를 버립니다.
편집하다:
또는 lastindexOf를 사용할 수 있습니다 (주문에 신경 쓰지 않는 경우).
arr = arr.filter(function (e, i, arr) {
return arr.lastIndexOf(e) === i;
});
이렇게하면 고유 한 요소가 유지되지만 마지막 항목 만 유지됩니다. 이는 [ '0', '1', '0']이 [ '0', '1']이 아니라 [ '1', '0']이됨을 의미합니다.
배열 프로토 타입 함수는 다음과 같습니다.
Array.prototype.unique = function() {
var unique = [];
for (var i = 0; i < this.length; i++) {
if (unique.indexOf(this[i]) == -1) {
unique.push(this[i]);
}
}
return unique;
};
_.uniq([1, 2, 1, 3, 1, 4]); //=> [1, 2, 3, 4]
이제 2014 년이었고 시간 복잡성은 여전히 중요합니다!
array.filter(function() {
var seen = {};
return function(element, index, array) {
return !(element in seen) && (seen[element] = 1);
};
}());
http://jsperf.com/array-filter-unique/13
function array_unique(arr) {
var result = [];
for (var i = 0; i < arr.length; i++) {
if (result.indexOf(arr[i]) == -1) {
result.push(arr[i]);
}
}
return result;
}
내장 기능이 아닙니다. 제품 목록에 항목이 없으면 고유 목록에 추가하고 고유 목록을 리턴하십시오.
당신은 간다! 아니에요!
Array.prototype.unique = function()
{
var tmp = {}, out = [];
for(var i = 0, n = this.length; i < n; ++i)
{
if(!tmp[this[i]]) { tmp[this[i]] = true; out.push(this[i]); }
}
return out;
}
var a = [1,2,2,7,4,1,'a',0,6,9,'a'];
var b = a.unique();
alert(a);
alert(b);
모든 종류의 배열 고유 구현은 여기에서 찾을 수 있습니다.
http://jsperf.com/distinct-hash-vs-comparison/12
http://jsperf.com/array-unique-functional
다음과 같은 기능적 스타일을 선호합니다.
var arr = ['lol', 1, 'fdgdfg', 'lol', 'dfgfg', 'car', 1, 'car', 'a', 'blah', 'b', 'c', 'd', '0', '1', '1', '2', '3', '3', '3', 'crazy', 'moot', 'car', 'lol', 1, 'fdgdfg', 'lol', 'dfgfg', 'car', 1, 'car', 'a', 'blah', 'b', 'c', 'd', '0', '1', '1', '2', '3', '3', '3', 'crazy', 'moot', 'car', 'lol', 1, 'fdgdfg'];
var newarr = arr.reduce(function (prev, cur) {
//console.log(prev, cur);
if (prev.indexOf(cur) < 0) prev.push(cur);
return prev;
}, []);
var secarr = arr.filter(function(element, index, array){
//console.log(element, array.indexOf(element), index);
return array.indexOf(element) >= index;
});
//reverses the order
var thirdarr = arr.filter(function (e, i, arr) {
//console.log(e, arr.lastIndexOf(e), i);
return arr.lastIndexOf(e) === i;
});
console.log(newarr);
console.log(secarr);
console.log(thirdarr);
function array_unique(nav_array) {
nav_array = nav_array.sort(function (a, b) { return a*1 - b*1; });
var ret = [nav_array[0]];
// Start loop at 1 as element 0 can never be a duplicate
for (var i = 1; i < nav_array.length; i++) {
if (nav_array[i-1] !== nav_array[i]) {
ret.push(nav_array[i]);
}
}
return ret;
}
작동합니다. 시도 해봐.
function getUnique(a) {
var b = [a[0]], i, j, tmp;
for (i = 1; i < a.length; i++) {
tmp = 1;
for (j = 0; j < b.length; j++) {
if (a[i] == b[j]) {
tmp = 0;
break;
}
}
if (tmp) {
b.push(a[i]);
}
}
return b;
}
I like to use this. There is nothing wrong with using the for loop, I just like using the build-in functions. You could even pass in a boolean argument for typecast or non typecast matching, which in that case you would use a for loop (the filter()
method/function does typecast matching (===))
Array.prototype.unique =
function()
{
return this.filter(
function(val, i, arr)
{
return (i <= arr.indexOf(val));
}
);
}
No redundant "return" array, no ECMA5 (I'm pretty sure!) and simple to read.
function removeDuplicates(target_array) {
target_array.sort();
var i = 0;
while(i < target_array.length) {
if(target_array[i] === target_array[i+1]) {
target_array.splice(i+1,1);
}
else {
i += 1;
}
}
return target_array;
}
Here is the way you can do remove duplicate values from the Array.
function ArrNoDupe(dupArray) {
var temp = {};
for (var i = 0; i < dupArray.length; i++) {
temp[dupArray[i]] = true;
var uniqueArray = [];
for (var k in temp)
uniqueArray.push(k);
return uniqueArray;
}
}
Another approach is to use an object for initial storage of the array information. Then convert back. For example:
var arr = ['0','1','1','2','3','3','3'];
var obj = {};
for(var i in arr)
obj[i] = true;
arr = [];
for(var i in obj)
arr.push(i);
Variable "arr" now contains ["0", "1", "2", "3", "4", "5", "6"]
Those of you who work with google closure library, have at their disposal goog.array.removeDuplicates
, which is the same as unique. It changes the array itself, though.
//
Array.prototype.unique =
( function ( _where ) {
return function () {
for (
var
i1 = 0,
dups;
i1 < this.length;
i1++
) {
if ( ( dups = _where( this, this[i1] ) ).length > 1 ) {
for (
var
i2 = dups.length;
--i2;
this.splice( dups[i2], 1 )
);
}
}
return this;
}
} )(
function ( arr, elem ) {
var locs = [];
var tmpi = arr.indexOf( elem, 0 );
while (
( tmpi ^ -1 )
&& (
locs.push( tmpi ),
tmpi = arr.indexOf( elem, tmpi + 1 ), 1
)
);
return locs;
}
);
//
Array.prototype.unique =function(){
var uniqObj={};
for(var i=0;i< this.length;i++){
uniqObj[this[i]]=this[i];
}
return uniqObj;
}
'program tip' 카테고리의 다른 글
Ruby on Rails : 10보다 작은 숫자 앞에 어떻게 0을 추가합니까? (0) | 2020.08.06 |
---|---|
Android Studio에서 외부 라이브러리 추가 (0) | 2020.08.06 |
Android startActivity () 전환 애니메이션을 변경할 수 있습니까? (0) | 2020.08.06 |
공유 환경 설정에서 클래스 객체 저장 및 검색 (0) | 2020.08.06 |
RecyclerView에서 match_parent 너비가 작동하지 않습니다 (0) | 2020.08.06 |