如何使用Javascript比较两个数组是否相等?

IT技术 javascript jquery arrays
2021-02-04 16:42:19

我希望数组的位置也相同,值也相同。

var array1 = [4,8,9,10];
var array2 = [4,8,9,10];

我试过这样

var array3 = array1 === array2   // returns false
6个回答

您可以使用Array.prototype.every()。(IE < 9 和其他旧浏览器需要一个 polyfill。)

var array1 = [4,8,9,10];
var array2 = [4,8,9,10];

var is_same = (array1.length == array2.length) && array1.every(function(element, index) {
    return element === array2[index]; 
});

工作演示。

这个答案也可以在这里找到:stackoverflow.com/a/19746771并注意它仅适用于浅等号(对于 OP 给出的示例来说完全没问题)。
2021-03-17 16:42:19
只有一点点改进:(array1.length === array2.length). ===而不是==.
2021-03-21 16:42:19
我可以用这个吗。它也工作正常。
2021-03-30 16:42:19

一种不太稳健的方法,但它有效。

a = [2, 4, 5].toString();
b = [2, 4, 5].toString();

console.log(a===b);
如果数组元素的顺序不同怎么办?这行不通
2021-03-30 16:42:19
我相信 JSON.jstringify 对于通用情况会更好。但是,据我所知@AndersonGreen,它的性能并不好
2021-03-31 16:42:19
如果 a =[2, 4, 5].toString()和 b = ,这种方法会给出错误的答案["2,4", 5].toString()
2021-04-06 16:42:19
如果您知道数组的顺序相同(就像我所做的那样),则效果很好。但是,您可以对数组元素进行排序,sort()然后这应该可以解决操作的问题。
2021-04-14 16:42:19
var array3 = array1 === array2

那会比较array1和array2是否是内存中的同一个数组对象,这不是你想要的。

为了执行您想要的操作,您需要检查两个数组是否具有相同的长度,以及每个索引中的每个成员是否相同。

假设你的数组充满了原语——数字和/或字符串——这样的事情应该做

function arraysAreIdentical(arr1, arr2){
    if (arr1.length !== arr2.length) return false;
    for (var i = 0, len = arr1.length; i < len; i++){
        if (arr1[i] !== arr2[i]){
            return false;
        }
    }
    return true; 
}
这是一个可以玩的小提琴(相同的答案,不同的迭代方式):jsfiddle.net/jimschubert/85M4z
2021-03-23 16:42:19
多维数组版本可在此处获得:stackoverflow.com/questions/7837456/...
2021-04-02 16:42:19

更现代的版本:

function arraysEqual(a, b) {
  a = Array.isArray(a) ? a : [];
  b = Array.isArray(b) ? b : [];
  return a.length === b.length && a.every((el, ix) => el === b[ix]);
}

将非数组参数强制为空数组会阻止a.every()爆炸。

如果您只想查看数组是否具有相同的元素集,则可以使用Array.includes()

function arraysContainSame(a, b) {
  a = Array.isArray(a) ? a : [];
  b = Array.isArray(b) ? b : [];
  return a.length === b.length && a.every(el => b.includes(el));
}
对我来说更好 - const areCollectionsSame = (a: unknown, b: unknown) => Array.isArray(a) && Array.isArray(b) ?a.length === b.length && a.every(el => b.includes(el)) : false;
2021-03-19 16:42:19
不幸的是,这会产生误报。例如: arraysEqual(23, "")
2021-03-22 16:42:19
这是故意的。不是数组==不是数组
2021-03-29 16:42:19
我的假设是清理输入比将每个调用都包装在一个try/catch块中要好,以免它轰炸你的程序。这是关于使用非数组参数调用它应该做什么的设计决定。如果你想在这种情况下抛出,那就去吧。
2021-04-09 16:42:19
我认为是否arraysEqual应该允许接收非数组输入是有争议的也就是说,了解上述“陷阱”仍然很好。
2021-04-11 16:42:19

你可以试试这个简单的方法

var array1 = [4,8,9,10];
var array2 = [4,8,9,10];

console.log(array1.join('|'));
console.log(array2.join('|'));

if (array1.join('|') === array2.join('|')) {
	console.log('The arrays are equal.');
} else {
	console.log('The arrays are NOT equal.');
}

array1 = [[1,2],[3,4],[5,6],[7,8]];
array2 = [[1,2],[3,4],[5,6],[7,8]];

console.log(array1.join('|'));
console.log(array2.join('|'));

if (array1.join('|') === array2.join('|')) {
	console.log('The arrays are equal.');
} else {
	console.log('The arrays are NOT equal.');
}

如果值的位置不重要,您可以先对数组进行排序。

if (array1.sort().join('|') === array2.sort().join('|')) {
    console.log('The arrays are equal.');
} else {
    console.log('The arrays are NOT equal.');
}
原始问题指出位置和值必须相同。如果位置不重要,那么您可以先对两个数组进行排序。
2021-04-01 16:42:19
转换为字符串是不可靠的,例如,当第一个数组是[4,8,9,10]而第二个数组时它会失败["4|8",9,10]
2021-04-01 16:42:19
这对我来说是一种更简单的解决方案,我正在比较两个矩阵之间的精确值,并且我的数组中没有按位 OR 运算符... @Broxzier
2021-04-05 16:42:19