基本上,我试图在数组对象中找到一个数组元素,但它总是返回-1。
这是代码
function myFunction() {
var myArray = [[0,1],[1,1],[1,2]];
var a = myArray .indexOf([0,1]);
document.getElementById("demo").innerHTML = a;
}
<p>Click the button to display the position of the element "[0,1]":</p>
<button onclick="myFunction()">Try it</button>
<p id="demo"></p>
答案 0 :(得分:2)
var myArray = [[0,1],[1,1],[1,2]];
在线上存储myArray对象中的三个数组对象。
现在您正在尝试检查其上的新数组的索引。
var a = myArray .indexOf([0,1]);
//这里[0,1]是新的数组对象,它有不同的引用
所以它总会返回-1。
只是为了验证,你可以这样做。
function myFunction() {
var a1 = [0,1];
var a2 = [1,1];
var a3 = [1,2];
var myArray = [a1,a2,a3];
var a = myArray.indexOf(a1);
document.getElementById("demo").innerHTML = a;
}
&#13;
<p>Click the button to display the position of the element "[0,1]":</p>
<button onclick="myFunction()">Try it</button>
<p id="demo"></p>
&#13;
它返回0,因为这里a1不是新对象
答案 1 :(得分:1)
它与javascript如何比较对象有关。从MDN复制:
请注意,当且仅当其比较是基元时,对象才会转换为基元。如果两个操作数都是对象,则将它们作为对象进行比较,并且只有当两个操作数引用同一个对象时,相等性测试才为真。
(不要忘记JS Array
在技术上是Object
)。你甚至可以在浏览器中看到这个非常简单(假设你有一些开发工具可供你使用):
[0, 1] == [0, 1]; # false -- They're different objects even though they have the same values.
但这是有效的,因为它们是相同的对象:
a = [0, 1];
a == a; # true
答案 2 :(得分:1)
严格比较对象是错误的,因为没有两个对象是相同的。您可以使用join()
和split()
将数组中的每个数组转换为字符串。然后使用indexOf
代替"0,1"
。
[0,1] === [0,1] // false
"0,1" === "0,1" // true
目标: ["0,1","1,1","1,2"].indexOf("0,1")
这是indexOf()
的预期用途
<小时/>
var needle = [0,1].join(); // or "0,1"
var haystack = [ [0,1],[1,1],[1,2] ];
var index = haystack.join('-').split('-').indexOf(needle);
document.getElementById("demo").innerHTML = index ;
<p id="demo"></p>
.join('-')
生成"0,1-1,1-1,2"
.split('-')
生成["0,1", "1,1", "1,2"]
.indexOf("0,1")
生成0
var needle = [0,1];
var haystack = [["0,1"],["1,1"],["1,2"]];
var index = getIndex(needle, haystack) // returns 0
function getIndex(needle, haystack) {
return haystack.join('-').split('-').indexOf( needle.join() );
}
答案 3 :(得分:0)
问题是.indexOf()
使用严格的相等比较===
。对于数组和对象,除非它们是同一个实例,否则永远不会成立,你可以看到:
[0,1] === [0,1] //Returns false
Reference MDN docs on Comparison
因此,您必须迭代数组才能找到相等索引。类似的东西:
function myFunction() {
var myArray = [[0,1],[1,1],[1,2]];
var a = -1;
var find = [0,1];
var idx = 0;
myArray.map(function(item) {
var valid = true;
for(var i=0; i<item.length; i++) {
if(item[i] !== find[i])
valid = false;
}
if(valid)
a = idx;
idx++;
});
document.getElementById("demo").innerHTML = a;
}
<p>Click the button to display the position of the element "[0,1]":</p>
<button onclick="myFunction()">Try it</button>
<p id="demo"></p>