【问题标题】:Assert if two 2D arrays are equal断言两个二维数组是否相等
【发布时间】:2014-11-24 10:22:38
【问题描述】:

给定两个二维数组,我如何断言它们是否相等?

例如:

array1 = [[1,0],[2,1],[3,0]]
array2 = [[1,0],[2,1],[3,1]]

检查array1 == array2是否有效的方法是什么?

【问题讨论】:

  • 每个索引的每个值都是相同的

标签: javascript multidimensional-array


【解决方案1】:

如果相等是指数组内容具有相同顺序的相同元素,那么最短(虽然不是最快)的方式将是:

JSON.stringify(array1) === JSON.stringify(array2)

这适用于任何维度的数组。

更新:如果您需要一个非常快速的算法,那么简单的迭代会更好。然而,它不是万无一失的,因此要使其真正安全可靠,您需要花费更多的开发时间。这是现代浏览器的一种可能的解决方案:

function equal(array1, array2) {
    if (!Array.isArray(array1) && !Array.isArray(array2)) {
        return array1 === array2;
    }

    if (array1.length !== array2.length) {
        return false;
    }

    for (var i = 0, len = array1.length; i < len; i++) {
        if (!equal(array1[i], array2[i])) {
            return false;
        }
    }

    return true;
}

以下 JSPerf 速度测试表明该算法优于简短的JSON 方法:http://jsperf.com/2d-array-comparion

【讨论】:

  • 我想知道一个专门用于检查的函数是否一定会更快,因为大多数 JavaScript 引擎现在都内置了JSON.stringify...成为一个有趣的jsperf.com...
  • @T.J.Crowder 我认为在这种方法中字符串连接可能很耗时。否则,如果速度不重要,那么这个解决方案应该是有效的,而且很简单。特别是如果我们将高效定义为“节省空间和开发时间”。
  • 嗯,这基本上就是我想知道的,鉴于它发生在引擎中,字符串生成可能是有效的。或者不是:-) 是一件有趣的事情要检查。但是, blenddd makes a good point 关于提前终止,显然 stringify 方面不会真正提供。所以答案很可能与它们相同或不同的频率有关。
  • @T.J.Crowder Iteration 显然更快:jsperf.com/2d-array-comparion:)
【解决方案2】:

最有效的方法始终取决于数组的大小以及您的应用程序和它们的使用情况。您可以检查 2 个数组的长度以在不匹配的情况下提前终止,但如果这种情况很少发生,这可能会被视为额外步骤。

boolean areEqual(array array1, array array2){
if array1.length != array2.length
    return false;
for (int i=0;i<array1.length; i++)
    if(!areEqual(array1[i], array2[i])
        return false;
return true;
}

boolean areEqual(int first, int second){
    return first == second;
}

【讨论】:

  • 不确定这意味着什么语言(问题是关于 JavaScript),但除了依赖于重载(JS 没有)之外,当然上述具有提前终止的优势。
  • 那更多的是伪代码,我没有注意到标签,我的错,但我想它很容易转换成javascript。
【解决方案3】:

要走的路是在一个嵌套循环中迭代所有值,逐个比较值。使用您在第一次不匹配时设置为 false 的布尔值,并断言该布尔值在您的测试中为 true。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 2019-01-14
    • 2010-09-29
    • 2017-11-07
    相关资源
    最近更新 更多