2014-11-20 3 views
1

D3과 함께 javascript를 사용하고 있습니다. 나는 노드 집합을 만들고 그것들을 클릭 할 수 있기를 원하고 그 노드의 ID가 배열에 추가되어 콘솔에 그 배열을 출력하여 선택된 노드를보고 원하는대로 선택을 할 수있게한다. (기본적으로 노드를 선택하고 선택 해제)배열에 값이 있는지 확인하는 방법 javascript

노드의 ID가 선택한 배열로 이동하도록 click 이벤트를 수행했습니다. 그러나 목록에 들어가기 전에이 배열을 검사하여 중복 된 정보가 없는지 확인하고 싶습니다.

selectedNodesArray=[]; 

for(var i = 0; i< selectedNodesArray.length; i++) 
    { 
    if(selectedNodesArray[i] === d.coreId) 
    { 
    console.log("that node is already selected");  
    } else 
    { 
    selectedNodesArray.push(d.coreId); 
    } 

} 
console.log(selectedNodesArray); 
} 

위의 내용은 내 for 루프입니다. 이유는 이해가 안됩니다. 어떤 아이디어? T.J.Crowder

if (!selectedNodesArray.some(function(entry) { return entry == d.coreId; })) { 
    selectedNodesArray.push(d.coreId); 
} 

답변

2

이상으로


대답은 내 for 루프, 내가이 일을 나던 이유를 이해 해달라고입니다. 어떤 아이디어?

당신은 일치하지 않는 push에 대한 모든 요소를 수행하고 있습니다. 따라서 배열에 [1, 2, 3]이 있고 2를 찾고 있다면 [2, 3, 2, 2]로 끝날 것입니다. 그렇지 않습니다.

플래그를 설정하고 플래그가 설정되어 있지 않으면 플래그를 사용하여 루프를 푸시하거나 항목을 찾은 다음 루프를 해제 한 다음 i < selectedNodesArray.length을 누르면이를 수정할 수 있습니다.

if (!selectedNodesArray.some(function(entry) { return entry == d.coreId; })) { 
    selectedNodesArray.push(d.coreId); 
} 

Array#some 콜백 반환 될 때까지 순서대로 배열의 각 항목에 대해 한 번 콜백 함수를 호출

하지만 나를 위해

, 이것은 Array#indexOf 의 경우입니다 또는 Array#some ( Barry's answer 참조) true 또는 배열 끝에 도달했습니다. 콜백이 true을 반환 한 경우 true을 반환하고 그렇지 않은 경우 false을 반환합니다. 모든 최신 브라우저에 존재합니다. IE8 또는 다른 유사한 브라우저를 지원해야하는 경우 polyfilled 될 수 있습니다.

+0

범례. 대단히 감사합니다 :) 입력을 주셔서 감사합니다 – rekoDolph

3

내가 무엇을 묻고 있는지 이해한다면, 요소가 이미 배열에 있는지 알아 보려면 indexOf()을 사용할 수 있습니다.

if(selectedNodesArray.indexOf(d.coreId) === -1){ 
     // push here because a value of -1 means it's not in the array 
} 
+1

입력을 주셔서 감사합니다, tjcrowder는 그것을 두려워합니다 : – rekoDolph

+0

'+ 1'과 Doh !! 나는 물건의 목록에서 어떤 물건에 의해서 물건을 찾는데 너무 익숙하다. @AaronJones 숫자 목록이면, 'indexOf'가 그 방법이 될 것입니다. –

4

배열의 "indexOf()"메서드를 사용하여 항목이 배열에 이미 있는지 확인하는 이유는 무엇입니까? 이것이 존재하면 항목의 위치가 리턴되고 그렇지 않으면 -1이 리턴됩니다. 이것은 For 루프를 통과하는 것보다 훨씬 빠릅니다.

if(selectedNodesArray.indexOf(d.coreId)===-1){ 
    selectedNodesArray.push(d.coreId); 
}else{ 
    console.log("that node is already selected"); 
} 

이제 이미있는 항목을 제거하려면 splice()를 사용할 수 있습니다. 먼저 indexOf()를 사용하여 항목을 찾은 다음 splice()를 사용하여 목록에서 해당 항목을 제거합니다.

+1

입력을 주셔서 감사합니다, tjcrowder 그것을 이길 두려워 :)하지만 공정한 대답은 이해하기 쉽습니다 :) – rekoDolph

관련 문제