我正在使用 JavaScript,并想检查数组中是否存在一个数组。
这是我的代码以及返回值:
var myArr = [1,3];
var prizes = [[1,3],[1,4]];
prizes.indexOf(myArr);
-1
为什么?
在 jQuery 中也是一样:
$.inArray(myArr, prizes);
-1
当元素存在于数组中时,为什么返回 -1?
我正在使用 JavaScript,并想检查数组中是否存在一个数组。
这是我的代码以及返回值:
var myArr = [1,3];
var prizes = [[1,3],[1,4]];
prizes.indexOf(myArr);
-1
为什么?
在 jQuery 中也是一样:
$.inArray(myArr, prizes);
-1
当元素存在于数组中时,为什么返回 -1?
你可以用这个
var a = [ [1,2] , [3,4] ];
var b = [1,2];
a = JSON.stringify(a);
b = JSON.stringify(b);
那么你可以只做一个 indexOf() 来检查它是否存在
var c = a.indexOf(b);
if(c != -1){
console.log('element present');
}
因为[1,3] !== [1,3]
,因为对象只有在引用同一个对象时才会相等。您需要编写自己的搜索例程:
function searchForArray(haystack, needle){
var i, j, current;
for(i = 0; i < haystack.length; ++i){
if(needle.length === haystack[i].length){
current = haystack[i];
for(j = 0; j < needle.length && needle[j] === current[j]; ++j);
if(j === needle.length)
return i;
}
}
return -1;
}
var arr = [[1,3],[1,2]];
var n = [1,3];
console.log(searchForArray(arr,n)); // 0
如果两个操作数都是对象,则将它们作为对象进行比较,并且仅当两者都引用同一个对象时,相等性测试才为真。
您可以迭代数组数组,Array#some
然后使用单个数组检查内部数组的每个项目Array#every
。
var array = [1, 3],
prizes = [[1, 3], [1, 4]],
includes = prizes.some(a => array.every((v, i) => v === a[i]));
console.log(includes);
因为这两种方法在操作对象时都使用引用相等性。存在的数组和您要搜索的数组可能在结构上是相同的,但它们是唯一的对象,因此它们不会进行比较。
这将给出预期的结果,即使它在实践中没有用:
var myArr = [1,3];
var prizes = [myArr,[1,4]];
prizes.indexOf(myArr);
要执行您想要的操作,您需要编写代码以递归方式显式比较数组的内容。
因为 javascript 对象是按身份而不是值进行比较的。因此,如果它们不引用相同的对象,它们将返回 false。
您需要递归比较才能正常工作。