【发布时间】: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
给定两个二维数组,我如何断言它们是否相等?
例如:
array1 = [[1,0],[2,1],[3,0]]
array2 = [[1,0],[2,1],[3,1]]
检查array1 == array2是否有效的方法是什么?
【问题讨论】:
标签: javascript multidimensional-array
如果相等是指数组内容具有相同顺序的相同元素,那么最短(虽然不是最快)的方式将是:
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。
【讨论】:
JSON.stringify...成为一个有趣的jsperf.com...
stringify 方面不会真正提供。所以答案很可能与它们相同或不同的频率有关。
:)
最有效的方法始终取决于数组的大小以及您的应用程序和它们的使用情况。您可以检查 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;
}
【讨论】:
要走的路是在一个嵌套循环中迭代所有值,逐个比较值。使用您在第一次不匹配时设置为 false 的布尔值,并断言该布尔值在您的测试中为 true。
【讨论】: