2014-09-02 117 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 2014-09-02 21:36:33

回答

3

.indexOf()方法,如同其被使用===全等运算符进行比较。在这些条件下,没有两个不同的阵列彼此相等。

当您使用数组(或者,对于该事物,对象)文字表达式来创建对象时,您会得到不同的单独对象。一个字面表达看起来完全像另一个的事实并不意味着他们共享身份。

+0

谢谢。有没有内置的函数可以为数组执行非严格的相等比较? – corycorycory 2014-09-03 13:59:11

+1

@corycorycory不,如果你想比较数组,你必须实现你自己的方法来做到这一点。对于像JavaScript这样的语言来说,通用的“深度比较”操作确实很难定义。 – Pointy 2014-09-03 14:13:03

0

的第二个用途声明

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

的节点1时已经存在创建为节点1词法环境的新条目。因此,对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)