【问题标题】:How to check if a multidimensional array has a specific array?如何检查多维数组是否具有特定数组?
【发布时间】:2013-03-15 16:19:12
【问题描述】:

如何检查arrays是否有array

var arrays = [[1, 1], [2, 2]];
var array = [1,1];

[1, 1] === [1, 1]; // false
arrays.includes(array); // false
arrays.indexOf(array); // -1

【问题讨论】:

标签: javascript arrays


【解决方案1】:

indexOf 使用严格相等 (===) 进行比较。您的元素必须是完全相同的对象。

所以

var a = [1,1];

var b = [a,[1,2]];

b.indexOf(a)// 0

因为a === a

但是

b.indexOf([1,1])// -1

因为 [1,1] 与 a 是不同的对象,所以它们并不严格相等。

MDN Docs

要做你想做的事,你需要做更多的事情。您可以遍历这些值并使用类似 this question's answers 中的内容进行比较

【讨论】:

    【解决方案2】:

    indexOf returns -1 if it does not find a match in the array。您的数组 a 不包含元素 b

    编辑:

    为了澄清@JonathanLonowski 所说的,不匹配的原因是因为您正在进行严格的比较,比较的是参考,而不是值。

    【讨论】:

    • 这就是我写的。问题是为什么。我们看到 'a' 和 'b' 包含 [1,1]
    • @Tukkan 因为每个[...] 都是new Array()!== 任何其他Array。它们可能相似,尤其是对人眼而言,但它们不是相同相等
    • 还有没有其他方法可以检查,并返回真值
    • @Tukkan 要么有 a 实际上包含 b 所以他们共享参考 - var b = [1,1], a = [b, [2,2]]; 或者,您必须使用将遍历的 deep-比较对象并比较它们包含的原始值。 stackoverflow.com/q/1068834 有一个例子。许多单元测试框架也有它的实现。示例:QUnit.
    • 谢谢@Jonathan Lonowski
    【解决方案3】:

    <Array>.some方法测试多维数组中是否至少有一个数组通过了提供的函数实现的测试。

    <Array>.every 方法测试数组中的所有数组项是否通过提供的函数实现的测试。

    这两种方法结合起来可以检查多维数组中的所有项目是否值得寻找。

    const checkArray = (arrays, array) => arrays.some(a => {
      return (a.length > array.length ? a : array).every((_, i) => a[i] === array[i]);
    });
    
    const arrays = [[0, 1], [2, 2], [0, 3, 2, 1]];
    
    [
      [0, 1],          // true
      [2, 2],          // true
      [0, 3, 2, 1],    // true
      [1, 0, 3, 2, 1], // false
      [2, 2, 1],       // false
      [0, 0],          // false
      [1, 2],          // false
      [0, 1, 2]        // false
    ].forEach(array => {
      console.log(checkArray(arrays, array));
    });

    【讨论】:

      猜你喜欢
      • 2018-04-16
      • 1970-01-01
      • 2018-01-05
      • 2013-10-25
      • 1970-01-01
      • 2016-09-11
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      相关资源
      最近更新 更多