检查数组中是否存在数组?

IT技术 javascript
2021-02-03 21:32:22

我正在使用 JavaScript,并想检查数组中是否存在一个数组。

这是我的代码以及返回值:

var myArr = [1,3];
var prizes = [[1,3],[1,4]];
prizes.indexOf(myArr);
-1

为什么?

在 jQuery 中也是一样:

$.inArray(myArr, prizes);
-1

当元素存在于数组中时,为什么返回 -1?

6个回答

你可以用这个

 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');
}
@Pirijan 如果它有效,这将非常优雅,但它没有JSON.stringify(a)返回[null]然后检查失败。
2021-03-16 21:32:22
@crclayton 应该用逗号分隔 2 个数组,我想我在发布答案时犯了一个错误,现在应该可以使用了
2021-03-18 21:32:22
这里的聚会有点晚了,但这很漂亮,绝对应该是公认的答案,因为它很简单。
2021-03-21 21:32:22

因为[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

参考

  • 使用相等运算符

    如果两个操作数都是对象,则将它们作为对象进行比较,并且仅当两者都引用同一个对象时,相等性测试才为真。

这个for循环的捷径在大多数 ESLint 配置中都会失败。
2021-03-16 21:32:22
for(var i in haystack ){for(i = 0; i < haystack.length; ++i){如果 haystack[1] 缺失并且定义了 haystack[0] 和 haystack[2], 而不是不会抛出异常 - 如果针匹配 haystack[2],仍然返回 i=2
2021-03-17 21:32:22
@BharathParlapalli:如果haystack[1]缺少,则haystack不是有效数组,因此不是searchForArray.
2021-03-21 21:32:22
在控制台中测试“[1,3] == [1,3]”...... Wat。
2021-04-08 21:32:22

您可以迭代数组数组,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);

这是一个整洁的!但请注意,如果array长度为 0,则它始终会返回 true,我认为您不希望这样。所以,你真的应该添加array.length && beforearray.every(...
2021-03-23 21:32:22

因为这两种方法在操作对象时都使用引用相等性。存在的数组和您要搜索的数组可能在结构上是相同的,但它们是唯一的对象,因此它们不会进行比较。

这将给出预期的结果,即使它在实践中没有用:

var myArr = [1,3];
var prizes = [myArr,[1,4]];
prizes.indexOf(myArr);

要执行您想要的操作,您需要编写代码以递归方式显式比较数组的内容。

因为 javascript 对象是按身份而不是值进行比较的。因此,如果它们不引用相同的对象,它们将返回 false。

您需要递归比较才能正常工作。