2016-07-29 2 views
1

내가 운동을보고하는 데 문제가 다음 작품이 (내가 배열에서 중복을 제거하기 위해 노력하고있어) 방법을 이해제거 중복 (코드를 이해)

var arr = ['a','b','c','a','b','d','e','f']; 
var uniqueArray = arr.filter(function(item,pos){ 
    return arr.indexOf(item) == pos; 
}); 

내 시도에 이해

여기서 itemarr에 우리의 모든 가치를 나타냅니다. 반복을 진행합니다. First item = 'a'pos = 0. 승인. 'a'의 색인이 0

여기 indexOf(a) == 0과 같은 경우에 기초하여 필터링 만합니다.

좋아요! 이것은 사실이며 새로운 배열에 넣을 수 있습니다.

지금이뿐만 아니라 우리의 요구 사항을 충족 Doesent ... pos = 3

arr.indexOf(a) == 3 

대기에서 즉, 우리가 다시 볼 곳으로 앞으로 이동할 수 있습니다? 심지어 복제물을 어떻게 제거합니까?

+0

경우 같은 배열에 보관하십시오. 그렇지 않은 경우, 즉 인덱스가 다른 경우 동일한 값을 갖는 요소가 여러 개 있음을 의미합니다. 그것을 제거하십시오. – Tushar

답변

1

indexOf은 정수 값 하나만 반환하며 첫 번째 발견 된 항목의 색인입니다. 따라서 pos이 3이고 itema이면 indexOf이 0을 반환합니다 (a의 첫 번째 인덱스가 0이기 때문에) 0==3이 거짓이며 요소가 제거됩니다.

이어서

상기 pos가 4 indexOf 반환 2 제의 인덱스 b 발견 (및 itemb이다).


개체의 경우 중복 키를 사용할 수 없습니다. 각각의 새 키는 자동으로 이전 키를 겹쳐 쓰므로 복제본이 없습니다.

는 봐 :

var obj = {a:1, a:3, b:2,c:5,b:4}; 
 
console.log(obj)

+0

indexOf는 처음 발견 된 항목의 색인을 얻는 방법을 어떻게 알 수 있습니까? 그것이 방금 생성 된 방법입니까? –

+0

@cres 당신이 요구하는 것이 확실하지 않습니다 ...'indexOf'는 처음 발견 된 요소의 색인을 반환하기 위해 만들어졌습니다. – nicael

+0

오. 그래서 기본적으로 아무리 많아도 indexOf (a)는 첫 번째 색인, 즉 0을 가리 킵니다. –

1

nicael는 권리입니다. indexOf(item)은 배열을 통과하여 처음으로 item이 배열에 나타나는 함수를 찾고 배열의 위치를 ​​반환합니다. 귀하의 예에서 0에 a이 있고 인덱스 3에 a이있는 경우 pos 값이 0 인 반면 indexOf('a')은 위치 0을 반환하므로 필터는 false를 반환합니다.

FOLLOW UP :

indexOf() 당신이 배열의 시작 부분 이외의 위치에서 검색을 시작 할 수있는 fromIndex의라는 또 다른 매개 변수를 가지고있다. 이 경우 'a'이 처음으로 건너 뛰도록 지정할 수 있습니다. arr.indexOf('a', 1)은 0이 아닌 1의 위치에서 검색을 시작합니다.이 경우에는 'a'이 3 위치에 있기 때문에이 함수는 true를 반환합니다.

개체에 필터를 사용할 수 있습니까?

아니요, 필터는 Array 개체의 특정 함수이기 때문에 아니요. keys()가 배열을 반환하기 때문에 Object.keys(myObject)에서 필터를 수행하여 객체의 키를 가져올 수 있습니다.

귀하의 예제를 사용 :

var keyArray = Object.keys(myObject); //object can't have duplicate keys 

keyArray.filter(function(item, index) { 

    return keyArray.indexOf(item) == index; //will never be false 

}); 
+0

감사합니다. 나는 이제 그것을 +1한다. 나는 물체에 대해서 같은 과정을 할 수 있을까? obj = {a : 1, a : 3, b : 2, c : 5, d : 6} 두 개의 속성이 있고 이제는 그것을 제거하고 싶습니다. –

+0

업데이트 된 답변보기 – kag359six

+0

생각하지 않습니다. 키가 자동으로 중복 제거되기 때문에 키를 필터링 할 수 있습니다. – nicael

-1

해시 테이블이 여기에 중복 값 을 제거하는 가장 좋은 방법은 코드입니다 : 현재 요소 요소의 첫 번째 인덱스로 인덱스를 가지고있다

char arr[] = ['a','b','c','a','b','d','e','f']; 
//it will contains all 26 places as zero (A - Z) 
char hashArray[26]={0} 
int i; //for iteration; 

for(i=0;arr[i]!='\0';i++) 
{ 
    //it will subtracte the ascii value of the letter 
    //from 'a' so that we have the values from 0 to 26) 
    hashArray[arr[i]-'a']=arr[i]; 
} 

for(i=0;i<26;i++) 
{ 
    if(hashArray[i]!=0) //to Ensure the positon has the character 
    { 
     printf("%c",hashArray[i]); 
    } 
} 
+0

이것은 질문 일뿐입니다. 무작위 질문에 대한 답변을 게시하는 이유는 무엇입니까? – nicael