2014-09-02 3 views
1

배열에 값이 이미 있는지 테스트하려고합니다.Javascript indexOf가 예상대로 작동하지 않습니다.

이 경우 "node1"의 값은 변경되지 않습니다. 두 배열은 동일합니다.

그러나 indexOf (node1) 테스트에도 불구하고 같은 노드가 배열에 두 번 추가됩니다. 그것은 === 항등 연산자를 사용하는 것처럼 http://jsfiddle.net/v9yxj5hm/2/

var tree_rows = []; 

var node1 = ['Workplace','Revenue Overall',0]; 
if (tree_rows.indexOf(node1) == -1){ tree_rows.push(node1); } 

node1 = ['Workplace','Revenue Overall',0]; 
if (tree_rows.indexOf(node1) == -1){ tree_rows.push(node1); } 

alert(tree_rows) 
+5

두 개의 배열은 두 개의 서로 다른 개체입니다. '[]! = []'. 반복하고 각 ** 항목을 비교해야합니다. – elclanrs

답변

3

.indexOf() 방법과 비교한다. 이러한 조건 하에서 두 개의 별개의 배열은 서로 동일하지 않습니다.

개체를 만들기 위해 array (또는 그와 관련하여 object) 리터럴 식을 사용하면 개별 개체가 구별됩니다. 하나의 리터럴 표현식이 다른 표현식과 정확하게 일치한다고해서 신원을 공유한다는 의미는 아닙니다.

+0

감사합니다. 배열에 대해 비 완전 항등 비교를 수행하는 내장 함수가 있습니까? – corycorycory

+1

@corycorycory 아니요, 배열을 비교하려면 자체 배열을 수행해야합니다. 범용 "deep compare"연산은 JavaScript와 같은 언어에 대해 정의하기가 정말 어렵습니다. – Pointy

0

노드 1이 이미 노드 1의 어휘 환경에서 새 항목을 만들 존재 선언

node1 = ['Workplace','Revenue Overall',0]; 

의 두 번째 사용. 결과적으로 indexOf에 대한 점검은 해당 항목에 대해 이전 값을 찾지 못합니다. 이것은 node1이 어레이에 두 번째 배치되는 것으로 끝납니다.

0

node1의 각 항목이 tree_rows인지 여부를 비교해야합니다. 너 이거 원하는거야?

var tree_rows = []; 

var node1 = ['Workplace','Revenue Overall',0]; 
for (i in node1) { if (tree_rows.indexOf(node1[i]) == -1){ tree_rows.push(node1[i]); }} 

node1 = ['Workplace','Revenue Overall',0]; 
for (i in node1) { if (tree_rows.indexOf(node1[i]) == -1){ tree_rows.push(node1[i]); }} 

alert(tree_rows) 
관련 문제