javascript indexOf() 不断返回 -1
javascript indexOf() keeps returning -1
我有一个这样的数组
var a = [[1, 0], [3, 0], [5, 0], [7, 0]];
我是运行很简单的一行indexOf()
。但是,尽管数组中确实存在我使用的测试值,但我一直得到 -1。
var i = a.indexOf([1, 0]);
console.log("INDEX: ", i);
我是不是哪里弄错了?
您可以使用 #findIndex()
and #every()
在 outer 数组中找到 inner 数组的索引 - 请参见下面的演示:
var a = [[1, 0], [3, 0], [5, 0], [7, 0]];
var search = [1,0]; // array to get index of from the 'a'
var i = a.findIndex(function(n) {
return search.every(function(p,q) {
return p === n[q]
});
});
console.log("INDEX: ", i);
更简单的 ES6 风格:
var a = [[1, 0], [3, 0], [5, 0], [7, 0]];
var search = [1, 0]; // array to get index of from the 'a'
var i = a.findIndex(n => search.every((p, q) => p === n[q]));
console.log("INDEX: ", i);
如@Nisarg 所述,当您将 indexOf 与数组一起传递时,它会检查引用而不是值。因此,为了获得正确的 indexOf,您应该为每个数组手动循环。
var a = [[1, 0], [3, 0], [5, 0], [7, 0]];
function arrayIndexOf(arr){
for(var x=0;x<a.length;x++){
if(arr[0]===a[x][0]&&arr[1]===a[x][1]){
return x
}
}
}
console.log(arrayIndexOf([1,0]));
indexOf
函数不按值比较数组。所以为了能够比较两个数组,你需要一个函数。在这种情况下,我使用了@Tomáš Zato 创建的函数 here.
一旦你有了它,你就可以迭代源数组并获得匹配数组的索引。
// Warn if overriding existing method
if(Array.prototype.equals)
console.warn("Overriding existing Array.prototype.equals. Possible causes: New API defines the method, there's a framework conflict or you've got double inclusions in your code.");
// attach the .equals method to Array's prototype to call it on any array
Array.prototype.equals = function (array) {
// if the other array is a falsy value, return
if (!array)
return false;
// compare lengths - can save a lot of time
if (this.length != array.length)
return false;
for (var i = 0, l=this.length; i < l; i++) {
// Check if we have nested arrays
if (this[i] instanceof Array && array[i] instanceof Array) {
// recurse into the nested arrays
if (!this[i].equals(array[i]))
return false;
}
else if (this[i] != array[i]) {
// Warning - two different object instances will never be equal: {x:20} != {x:20}
return false;
}
}
return true;
}
// Hide method from for-in loops
Object.defineProperty(Array.prototype, "equals", {enumerable: false});
var a = [[1, 0], [3, 0], [5, 0], [7, 0]];
var index = -1;
for(var i = 0; i < a.length; i++) {
if(a[i].equals([1,0])) {
index = i;
}
}
console.log(index);
我有一个这样的数组
var a = [[1, 0], [3, 0], [5, 0], [7, 0]];
我是运行很简单的一行indexOf()
。但是,尽管数组中确实存在我使用的测试值,但我一直得到 -1。
var i = a.indexOf([1, 0]);
console.log("INDEX: ", i);
我是不是哪里弄错了?
您可以使用 #findIndex()
and #every()
在 outer 数组中找到 inner 数组的索引 - 请参见下面的演示:
var a = [[1, 0], [3, 0], [5, 0], [7, 0]];
var search = [1,0]; // array to get index of from the 'a'
var i = a.findIndex(function(n) {
return search.every(function(p,q) {
return p === n[q]
});
});
console.log("INDEX: ", i);
更简单的 ES6 风格:
var a = [[1, 0], [3, 0], [5, 0], [7, 0]];
var search = [1, 0]; // array to get index of from the 'a'
var i = a.findIndex(n => search.every((p, q) => p === n[q]));
console.log("INDEX: ", i);
如@Nisarg 所述,当您将 indexOf 与数组一起传递时,它会检查引用而不是值。因此,为了获得正确的 indexOf,您应该为每个数组手动循环。
var a = [[1, 0], [3, 0], [5, 0], [7, 0]];
function arrayIndexOf(arr){
for(var x=0;x<a.length;x++){
if(arr[0]===a[x][0]&&arr[1]===a[x][1]){
return x
}
}
}
console.log(arrayIndexOf([1,0]));
indexOf
函数不按值比较数组。所以为了能够比较两个数组,你需要一个函数。在这种情况下,我使用了@Tomáš Zato 创建的函数 here.
一旦你有了它,你就可以迭代源数组并获得匹配数组的索引。
// Warn if overriding existing method
if(Array.prototype.equals)
console.warn("Overriding existing Array.prototype.equals. Possible causes: New API defines the method, there's a framework conflict or you've got double inclusions in your code.");
// attach the .equals method to Array's prototype to call it on any array
Array.prototype.equals = function (array) {
// if the other array is a falsy value, return
if (!array)
return false;
// compare lengths - can save a lot of time
if (this.length != array.length)
return false;
for (var i = 0, l=this.length; i < l; i++) {
// Check if we have nested arrays
if (this[i] instanceof Array && array[i] instanceof Array) {
// recurse into the nested arrays
if (!this[i].equals(array[i]))
return false;
}
else if (this[i] != array[i]) {
// Warning - two different object instances will never be equal: {x:20} != {x:20}
return false;
}
}
return true;
}
// Hide method from for-in loops
Object.defineProperty(Array.prototype, "equals", {enumerable: false});
var a = [[1, 0], [3, 0], [5, 0], [7, 0]];
var index = -1;
for(var i = 0; i < a.length; i++) {
if(a[i].equals([1,0])) {
index = i;
}
}
console.log(index);