我有一个像这样的数组
var a = [[1, 0], [3, 0], [5, 0], [7, 0]];
我正在运行一个非常简单的indexOf()
行。但是,尽管我使用的测试值确实存在于数组中,但我仍然保持-1。
var i = a.indexOf([1, 0]);
console.log("INDEX: ", i);
我在某处犯了错误吗?
答案 0 :(得分:2)
您可以使用#findIndex()
和#every()
查找外部数组中内部数组的索引 - 请参阅下面的演示:
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);
答案 1 :(得分:1)
正如@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]));
答案 2 :(得分:1)
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);