중복 값이 있는지 확인하려면 JavaScript 배열을 확인해야합니다. 가장 쉬운 방법은 무엇입니까? 중복 된 값이 무엇인지 찾아야합니다. 실제로 색인이나 중복 횟수가 필요하지 않습니다.
배열을 반복하고 일치하는 다른 모든 값을 확인할 수 있지만 더 쉬운 방법이 있어야합니다.
중복 값이 있는지 확인하려면 JavaScript 배열을 확인해야합니다. 가장 쉬운 방법은 무엇입니까? 중복 된 값이 무엇인지 찾아야합니다. 실제로 색인이나 중복 횟수가 필요하지 않습니다.
배열을 반복하고 일치하는 다른 모든 값을 확인할 수 있지만 더 쉬운 방법이 있어야합니다.
답변:
배열을 정렬 한 다음 실행하여 다음 (또는 이전) 인덱스가 현재와 같은지 확인할 수 있습니다. 정렬 알고리즘이 양호하다고 가정하면 O (n 2 ) 보다 작아야합니다 .
const findDuplicates = (arr) => {
let sorted_arr = arr.slice().sort(); // You can define the comparing function here.
// JS by default uses a crappy string compare.
// (we use slice to clone the array so the
// original array won't be modified)
let results = [];
for (let i = 0; i < sorted_arr.length - 1; i++) {
if (sorted_arr[i + 1] == sorted_arr[i]) {
results.push(sorted_arr[i]);
}
}
return results;
}
let duplicatedArray = [9, 9, 111, 2, 3, 4, 4, 5, 7];
console.log(`The duplicates in ${duplicatedArray} are ${findDuplicates(duplicatedArray)}`);
중복의 함수로 반환하려는 경우. 이것은 비슷한 유형의 경우입니다.
arr = [9, 9, 9, 111, 2, 3, 3, 3, 4, 4, 5, 7];
i++
. 대신에 그들은 쓰지 말라고한다 j = i + +j
. 다른 두 가지 IMHO. 나는 i += 1
단순하고 아름다운 것보다 더 혼란 스럽다고 생각합니다. i++
:)
var sorted_arr = arr.sort()
은 쓸모가 없습니다 : arr.sort()
원래 배열을 변경합니다 (자체적으로 문제가됩니다). 또한 요소를 버립니다. cc @dystroy 더 깨끗한 해결책은 다음과 같습니다.results = arr.filter(function(elem, pos) { return arr.indexOf(elem) == pos; })
복제본을 구상하려면 다음과 같은 훌륭한 솔루션을 시도하십시오.
function eliminateDuplicates(arr) {
var i,
len = arr.length,
out = [],
obj = {};
for (i = 0; i < len; i++) {
obj[arr[i]] = 0;
}
for (i in obj) {
out.push(i);
}
return out;
}
출처 : http://dreaminginjavascript.wordpress.com/2008/08/22/eliminating-duplicates/
이것은 중복 스레드 (!)의 대답입니다.
이 항목을 작성할 때 2014-모든 예제는 for-loops 또는 jQuery입니다. Javascript에는 정렬, 매핑 및 축소와 같은 완벽한 도구가 있습니다.
var names = ['Mike', 'Matt', 'Nancy', 'Adam', 'Jenny', 'Nancy', 'Carl']
var uniq = names
.map((name) => {
return {
count: 1,
name: name
}
})
.reduce((a, b) => {
a[b.name] = (a[b.name] || 0) + b.count
return a
}, {})
var duplicates = Object.keys(uniq).filter((a) => uniq[a] > 1)
console.log(duplicates) // [ 'Nancy' ]
@ Dmytro-Laptin은 일부 코드 코드가 제거되었다고 지적했습니다. 이것은 동일한 코드의보다 컴팩트 한 버전입니다. 일부 ES6 트릭과 고차 함수 사용 :
const names = ['Mike', 'Matt', 'Nancy', 'Adam', 'Jenny', 'Nancy', 'Carl']
const count = names =>
names.reduce((a, b) => ({ ...a,
[b]: (a[b] || 0) + 1
}), {}) // don't forget to initialize the accumulator
const duplicates = dict =>
Object.keys(dict).filter((a) => dict[a] > 1)
console.log(count(names)) // { Mike: 1, Matt: 1, Nancy: 2, Adam: 1, Jenny: 1, Carl: 1 }
console.log(duplicates(count(names))) // [ 'Nancy' ]
이것은 실제로 배열에서 중복 값을 찾는 가장 짧은 방법 중 하나 여야합니다. OP에서 특별히 요청한대로 중복을 제거하지는 않지만 찾습니다 .
var input = [1, 2, 3, 1, 3, 1];
var duplicates = input.reduce(function(acc, el, i, arr) {
if (arr.indexOf(el) !== i && acc.indexOf(el) < 0) acc.push(el); return acc;
}, []);
document.write(duplicates); // = 1,3 (actual array == [1, 3])
정렬 또는 타사 프레임 워크가 필요하지 않습니다. 또한 수동 루프가 필요하지 않습니다. indexOf () (또는 더 명확하게하기 위해 : 엄격한 비교 연산자 )가 지원 하는 모든 값으로 작동 합니다.
의 때문에 것은 감소 () 와 같이 IndexOf () 는 적어도 IE 9이 필요합니다.
const dupes = items.reduce((acc, v, i, arr) => arr.indexOf(v) !== i && acc.indexOf(v) === -1 ? acc.concat(v) : acc, [])
이 함수를 추가하거나 조정하여 Javascript의 Array 프로토 타입에 추가 할 수 있습니다.
Array.prototype.unique = function () {
var r = new Array();
o:for(var i = 0, n = this.length; i < n; i++)
{
for(var x = 0, y = r.length; x < y; x++)
{
if(r[x]==this[i])
{
alert('this is a DUPE!');
continue o;
}
}
r[r.length] = this[i];
}
return r;
}
var arr = [1,2,2,3,3,4,5,6,2,3,7,8,5,9];
var unique = arr.unique();
alert(unique);
업데이트 됨 : 다음은 최적화 된 결합 전략을 사용합니다. 해시 O (1) 조회 시간 ( unique
기본 요소 배열에서 실행 되는 것은 O (n) 임)의 이점을 얻도록 기본 조회를 최적화합니다 . 객체 조회는 반복하면서 고유 ID로 객체에 태그를 지정하여 최적화되므로 중복 객체를 식별하는 것도 항목 당 O (1)이고 전체 목록에 대해 O (n)입니다. 유일한 예외는 고정 된 항목이지만 드물고 대체는 array 및 indexOf를 사용하여 제공됩니다.
var unique = function(){
var hasOwn = {}.hasOwnProperty,
toString = {}.toString,
uids = {};
function uid(){
var key = Math.random().toString(36).slice(2);
return key in uids ? uid() : uids[key] = key;
}
function unique(array){
var strings = {}, numbers = {}, others = {},
tagged = [], failed = [],
count = 0, i = array.length,
item, type;
var id = uid();
while (i--) {
item = array[i];
type = typeof item;
if (item == null || type !== 'object' && type !== 'function') {
// primitive
switch (type) {
case 'string': strings[item] = true; break;
case 'number': numbers[item] = true; break;
default: others[item] = item; break;
}
} else {
// object
if (!hasOwn.call(item, id)) {
try {
item[id] = true;
tagged[count++] = item;
} catch (e){
if (failed.indexOf(item) === -1)
failed[failed.length] = item;
}
}
}
}
// remove the tags
while (count--)
delete tagged[count][id];
tagged = tagged.concat(failed);
count = tagged.length;
// append primitives to results
for (i in strings)
if (hasOwn.call(strings, i))
tagged[count++] = i;
for (i in numbers)
if (hasOwn.call(numbers, i))
tagged[count++] = +i;
for (i in others)
if (hasOwn.call(others, i))
tagged[count++] = others[i];
return tagged;
}
return unique;
}();
ES6 모음을 사용할 수있는 경우 훨씬 간단하고 훨씬 빠른 버전이 있습니다. (IE9 + 및 기타 브라우저의 경우 : https://github.com/Benvie/ES6-Harmony-Collections-Shim )
function unique(array){
var seen = new Set;
return array.filter(function(item){
if (!seen.has(item)) {
seen.add(item);
return true;
}
});
}
업데이트 : 짧은 원 라이너로 복제본을 얻습니다.
[1, 2, 2, 4, 3, 4].filter((e, i, a) => a.indexOf(e) !== i) // [2, 4]
중복없이 배열을 얻으려면 단순히 조건을 반전하십시오.
[1, 2, 2, 4, 3, 4].filter((e, i, a) => a.indexOf(e) === i) // [1, 2, 3, 4]
나는 단순히 filter()
아래의 오래된 대답에서 생각하지 않았다 .)
이 질문 에서 요청한대로 중복이 없는지 확인하는 것만으로도이 every()
방법을 사용할 수 있습니다 .
[1, 2, 3].every((e, i, a) => a.indexOf(e) === i) // true
[1, 2, 1].every((e, i, a) => a.indexOf(e) === i) // false
참고 every()
아래의 IE 8 작동하지 않습니다.
var a = ["a","a","b","c","c"];
a.filter(function(value,index,self){ return (self.indexOf(value) !== index )})
'a'
배열, 내측 필터 함수 index == 1
반면self.indexOf('a') == 0
이것은 당신이 원하는 것을 얻을 것입니다.
function find_duplicates(arr) {
var len=arr.length,
out=[],
counts={};
for (var i=0;i<len;i++) {
var item = arr[i];
counts[item] = counts[item] >= 1 ? counts[item] + 1 : 1;
if (counts[item] === 2) {
out.push(item);
}
}
return out;
}
find_duplicates(['one',2,3,4,4,4,5,6,7,7,7,'pig','one']); // -> ['one',4,7] in no particular order.
// 🚩🚩 🚩 🚩
var arr = [1,2,2,3,3,4,5,6,2,3,7,8,5,22],
arr2 = [1,2,511,12,50],
arr3 = [22],
unique;
// Combine all the arrays to a single one
unique = arr.concat(arr2, arr3)
// create a new (dirty) Array with only the unique items
unique = unique.map((item,i) => unique.includes(item, i+1) ? item : '' )
// Cleanup - remove duplicate & empty items items
unique = [...new Set(unique)].filter(n => n)
console.log(unique)
Array.prototype.unique = function () {
var arr = this.sort(), i; // input must be sorted for this to work
for( i=arr.length; i--; )
arr[i] === arr[i-1] && arr.splice(i,1); // remove duplicate item
return arr;
}
var arr = [1,2,2,3,3,4,5,6,2,3,7,8,5,9],
arr2 = [1,2,511,12,50],
arr3 = [22],
// merge arrays & call custom Array Prototype - "unique"
unique = arr.concat(arr2, arr3).unique();
console.log(unique); // [22, 50, 12, 511, 2, 1, 9, 5, 8, 7, 3, 6, 4]
if (!Array.prototype.indexOf){
Array.prototype.indexOf = function(elt /*, from*/){
var len = this.length >>> 0;
var from = Number(arguments[1]) || 0;
from = (from < 0) ? Math.ceil(from) : Math.floor(from);
if (from < 0)
from += len;
for (; from < len; from++){
if (from in this && this[from] === elt)
return from;
}
return -1;
};
}
if( $.inArray(this[i], arr) == -1 )
추가하는 대신 Array.prototype.indexOf
var r = [];
코드를 작동시키기 위해 초기화 해야했습니다. 그리고 매력처럼 일했습니다.
r
변수
여기 내 단순하고 한 줄 솔루션이 있습니다.
고유 한 요소를 먼저 검색하지 않고 Set를 사용하여 찾은 배열을 고유하게 만듭니다.
그래서 결국에는 중복 배열이 있습니다.
var array = [1, 2, 2, 3, 3, 4, 5, 6, 2, 3, 7, 8, 5, 22, 1, 2, 511, 12, 50, 22];
console.log([...new Set(
array.filter((value, index, self) => self.indexOf(value) !== index))]
);
이것은 나의 제안이다 (ES6).
let a = [1, 2, 3, 4, 2, 2, 4, 1, 5, 6]
let b = [...new Set(a.sort().filter((o, i) => o !== undefined && a[i + 1] !== undefined && o === a[i + 1]))]
// b is now [1, 2, 4]
undefined
중복 임을보고합니다 .
var a = [324,3,32,5,52,2100,1,20,2,3,3,2,2,2,1,1,1].sort();
a.filter(function(v,i,o){return i&&v!==o[i-1]?v:0;});
또는 배열의 프로토 타입 체인에 추가 될 때
//copy and paste: without error handling
Array.prototype.unique =
function(){return this.sort().filter(function(v,i,o){return i&&v!==o[i-1]?v:0;});}
여기를 참조하십시오 : https://gist.github.com/1305056
i&&
배열의 범위를 벗어나는 것을 피 한다고 가정 하지만 정렬 된 배열의 첫 번째 요소는 포함되지 않습니다. 귀하의 예에서는 1
결과 배열 이 없습니다 . IE는 return i&&v!==o[i-1]?v:0;
해야한다return v!==o[i-1];
es6 객체 구조 제거를 통한 빠르고 우아한 방법
O (n) (배열에서 1 회 반복)으로 실행되며 2 번 이상 나타나는 값을 반복하지 않습니다
const arr = ['hi', 'hi', 'hi', 'bye', 'bye', 'asd']
const {
dup
} = arr.reduce(
(acc, curr) => {
acc.items[curr] = acc.items[curr] ? acc.items[curr] += 1 : 1
if (acc.items[curr] === 2) acc.dup.push(curr)
return acc
}, {
items: {},
dup: []
},
)
console.log(dup)
// ['hi', 'bye']
내가 생각할 수있는 가장 간단한 해결책은 다음과 같습니다.
const arr = [-1, 2, 2, 2, 0, 0, 0, 500, -1, 'a', 'a', 'a']
const filtered = arr.filter((el, index) => arr.indexOf(el) !== index)
// => filtered = [ 2, 2, 0, 0, -1, 'a', 'a' ]
const duplicates = [...new Set(filtered)]
console.log(duplicates)
// => [ 2, 0, -1, 'a' ]
그게 다야.
노트 :
0
, 문자열 및 음수를 포함한 모든 숫자와 함께 작동 합니다. 예 -1
-
관련 질문 : JavaScript 배열에서 모든 고유 값 가져 오기 (중복 제거)
원본 배열 arr
이 유지됩니다 ( filter
원본을 수정하는 대신 새 배열을 반환 함)
filtered
배열을 포함 하는 모든 중복; 또한 하나 이상의 동일한 값을 포함 할 수 있습니다 (예 : 필터링 된 배열은 여기입니다 [ 2, 2, 0, 0, -1, 'a', 'a' ]
)
당신이 얻을하려는 경우 에만 당신은 사용할 수 있습니다 (같은 값을 여러 개 중복 싶지 않아) 중복되는 값을 [...new Set(filtered)]
(ES6는 객체가 세트 에만 고유 한 값을 저장할 수 있습니다)
도움이 되었기를 바랍니다.
매우 가볍고 쉬운 방법은 다음과 같습니다.
var codes = dc_1.split(',');
var i = codes.length;
while (i--) {
if (codes.indexOf(codes[i]) != i) {
codes.splice(i,1);
}
}
ES6 (또는 Babel 또는 Typescipt 사용)을 사용하면 다음을 수행 할 수 있습니다.
var duplicates = myArray.filter(i => myArray.filter(ii => ii === i).length > 1);
ES6 구문의 간단한 코드 (복제 된 정렬 된 배열 반환) :
let duplicates = a => {d=[]; a.sort((a,b) => a-b).reduce((a,b)=>{a==b&&!d.includes(a)&&d.push(a); return b}); return d};
사용하는 방법:
duplicates([1,2,3,10,10,2,3,3,10]);
짧막 한 농담
var arr = [9,1,2,4,3,4,9]
console.log(arr.filter((ele,indx)=>indx!==arr.indexOf(ele))) //get the duplicates
console.log(arr.filter((ele,indx)=>indx===arr.indexOf(ele))) //remove the duplicates
indx!
첫 번째 예를 들어합니까?
indx !== ...
-엄격한 불평등을 의미 합니다.
result.filter((ele,indx) => indx !== result.map(e => e.name).indexOf(ele.name));
이 답변은 도움이 될 수도 있습니다 .js reduce
operator / method 를 사용 하여 배열에서 중복 을 제거 합니다.
const result = [1, 2, 2, 3, 3, 3, 3].reduce((x, y) => x.includes(y) ? x : [...x, y], []);
console.log(result);
new Set([1, 2, 2, 3, 3, 3, 3])
중복을 제거 할 수 있습니다
다음 함수 (이미 언급 된 removeDuplicates 함수의 변형)는 입력 [ "test", "test2", "test2", 1, 1, 1, 2에 대해 test2,1,7,5를 반환하는 트릭을 수행하는 것으로 보입니다. , 3, 4, 5, 6, 7, 7, 10, 22, 43, 1, 5, 8]
JavaScript 배열은 거의 모든 것을 담을 수 있기 때문에 대부분의 다른 언어보다 JavaScript에서이 문제가 익숙하지 않습니다. 정렬을 사용하는 솔루션은 적절한 정렬 기능을 제공해야 할 수도 있습니다. 아직 해당 경로를 시도하지 않았습니다.
이 특정 구현은 (적어도) 문자열과 숫자에 적용됩니다.
function findDuplicates(arr) {
var i,
len=arr.length,
out=[],
obj={};
for (i=0;i<len;i++) {
if (obj[arr[i]] != null) {
if (!obj[arr[i]]) {
out.push(arr[i]);
obj[arr[i]] = 1;
}
} else {
obj[arr[i]] = 0;
}
}
return out;
}
ES5 전용 (즉, IE8 이하의 경우 filter () polyfill이 필요함) :
var arrayToFilter = [ 4, 5, 5, 5, 2, 1, 3, 1, 1, 2, 1, 3 ];
arrayToFilter.
sort().
filter( function(me,i,arr){
return (i===0) || ( me !== arr[i-1] );
});
var arr = [2, 1, 2, 2, 4, 4, 2, 5];
function returnDuplicates(arr) {
return arr.reduce(function(dupes, val, i) {
if (arr.indexOf(val) !== i && dupes.indexOf(val) === -1) {
dupes.push(val);
}
return dupes;
}, []);
}
alert(returnDuplicates(arr));
이 함수 는 정렬 단계를 피하고 reduce () 메소드를 사용하여 중복이 존재하지 않는 경우 중복을 새 배열로 푸시합니다.
이것은 아마도 가장 많은 기능보다 10 배나 빠른 배열에서 복제본을 영구적으로 제거하는 가장 빠른 방법 중 하나 일 것입니다 .
function toUnique(a,b,c){//array,placeholder,placeholder
b=a.length;
while(c=--b)while(c--)a[b]!==a[c]||a.splice(c,1)
}
var array=[1,2,3,4,5,6,7,8,9,0,1,2,1];
toUnique(array);
console.log(array);
위의 코드를 읽을 수없는 경우 자바 스크립트 책을 읽거나 짧은 코드에 대한 설명을 참조하십시오. https://stackoverflow.com/a/21353032/2450730
편집
주석에서 언급 했듯이이 함수는 고유 한 배열을 반환하지만 질문은 중복 항목을 찾도록 요청합니다. 이 경우이 함수를 간단하게 수정하면 복제본을 배열로 푸시 한 다음 이전 함수를 사용 toUnique
하여 복제본의 복제본을 제거 할 수 있습니다.
function theDuplicates(a,b,c,d){//array,placeholder,placeholder
b=a.length,d=[];
while(c=--b)while(c--)a[b]!==a[c]||d.push(a.splice(c,1))
}
var array=[1,2,3,4,5,6,7,8,9,0,1,2,1];
toUnique(theDuplicates(array));
"includes"를 사용하여 요소가 이미 존재하는지 테스트하십시오.
var arr = [1, 1, 4, 5, 5], darr = [], duplicates = [];
for(var i = 0; i < arr.length; i++){
if(darr.includes(arr[i]) && !duplicates.includes(arr[i]))
duplicates.push(arr[i])
else
darr.push(arr[i]);
}
console.log(duplicates);
<h3>Array with duplicates</h3>
<p>[1, 1, 4, 5, 5]</p>
<h3>Array with distinct elements</h3>
<p>[1, 4, 5]</p>
<h3>duplicate values are</h3>
<p>[1, 5]</p>
ES6은 기본적으로 중복을 허용하지 않는 배열 인 Set 데이터 구조를 제공합니다. Set 데이터 구조를 사용하면 배열에서 중복을 찾을 수있는 매우 쉬운 방법이 있습니다 (하나의 루프 만 사용).
여기 내 코드가 있습니다
function findDuplicate(arr) {
var set = new Set();
var duplicates = new Set();
for (let i = 0; i< arr.length; i++) {
var size = set.size;
set.add(arr[i]);
if (set.size === size) {
duplicates.add(arr[i]);
}
}
return duplicates;
}
방금 배열 필터를 사용하여이를 달성하는 간단한 방법을 알아 냈습니다.
var list = [9, 9, 111, 2, 3, 4, 4, 5, 7];
// Filter 1: to find all duplicates elements
var duplicates = list.filter(function(value,index,self) {
return self.indexOf(value) !== self.lastIndexOf(value) && self.indexOf(value) === index;
});
console.log(duplicates);
논리를 따르는 것이 더 쉽고 빠릅니다.
// @Param:data:Array that is the source
// @Return : Array that have the duplicate entries
findDuplicates(data: Array<any>): Array<any> {
return Array.from(new Set(data)).filter((value) => data.indexOf(value) !== data.lastIndexOf(value));
}
장점 :
논리 설명 :
참고 : map () 및 filter () 메서드는 효율적이고 빠릅니다.