我有数组
array = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]];
我想找到子数组的索引
[1, 2, 3, 4]
所以它应该返回值 0
但每次我尝试这样做时,它都会返回 -1
这是我尝试过的:
array.indexOf(1, 2, 3, 4);
我知道这是因为我正在搜索的子数组中有逗号。
我怎样才能解决这个问题
我有数组
array = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]];
我想找到子数组的索引
[1, 2, 3, 4]
所以它应该返回值 0
但每次我尝试这样做时,它都会返回 -1
这是我尝试过的:
array.indexOf(1, 2, 3, 4);
我知道这是因为我正在搜索的子数组中有逗号。
我怎样才能解决这个问题
这是一个快速而肮脏的解决方案,它将数组作为字符串进行比较:
var array = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]];
var target = [9, 10, 11, 12].toString();
for(var i=0; i<array.length; i++) {
if(target === array[i].toString()) break;
}
if(i >= array.length) {
console.log("not found");
} else {
console.log("found at index " + i);
}
问题是当 javascript 用于==
比较数组时,它不能按预期工作。您必须构建自己的数组相等检查器(请参阅如何使用 JavaScript 检查两个数组是否相等?)。然后遍历数组并检查每个子元素是否等于您要查找的那个
function arraysEqual(a, b) {
if (a === b) return true;
if (a == null || b == null) return false;
if (a.length != b.length) return false;
// If you don't care about the order of the elements inside
// the array, you should sort both arrays here.
for (var i = 0; i < a.length; ++i) {
if (a[i] !== b[i]) return false;
}
return true;
}
var haystack = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]];
var needle = [1, 2, 3, 4];
var i = 0;
for(var sub in haystack) {
if(array_equal(sub, needle)) { // found it
return i;
}
i++;
}
if(i >= haystack.size) //didn't find it
i = -1;
return i; //return the index of the found needle-array
一个非常简单的字符串匹配实现,只使用本机方法而不使用变量:
[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]
.map( /./.test, RegExp( "^"+ [9, 10, 11, 12]+"$" )).indexOf(true); // === 2