如何在javascript中检查数组是否相等?

时间:2012-10-07 15:59:19

标签: javascript arrays comparison

查看此代码示例or go to the jsfiddle

function printRelation(a, b, out) {
    var text;
    if (a === b) {
        text = "a === b";
    } else if (a == b) {
        text = "a == b";
    } else {
        text = "a != b";
    }
    $('#' + out).text(text);
}

var a = [0, 0, 2], b = a;
printRelation(a, b, 'out1');
a = [0, 0, 2];
b = [0, 0, 2];
printRelation(a, b, 'out2');

我原本希望两个测试都输出a === b,但只有第一个测试输出a != b。第二个输出{{1}}。谁能解释这种行为?如何在javascript中有效地比较数组?

4 个答案:

答案 0 :(得分:25)

您可以使用Underscore.js库的isEqual方法。

http://underscorejs.org/#isEqual

  

执行两个对象之间的优化深度比较   确定他们是否应被视为平等。

var moe   = {name : 'moe', luckyNumbers : [13, 27, 34]};
var clone = {name : 'moe', luckyNumbers : [13, 27, 34]};
moe == clone;
=> false
_.isEqual(moe, clone);
=> true

更新

Lodash的灵感来自下划线,但现在是卓越的解决方案

https://lodash.com/docs/#isEqual

  

执行两个对象之间的优化深度比较   确定他们是否应被视为平等。

var object = { 'a': 1 };
var other = { 'a': 1 };

_.isEqual(object, other);
// => true

object === other;
// => false

答案 1 :(得分:12)

使用lodash

_.isEqual([1,2],[1,2])

也适用于对象。

_.isEqual({a:1}, {a:1})

答案 2 :(得分:7)

数组是javascript中的对象。与比较字符串或数字时通常使用的==无法比较对象。

还有很多其他比较数组的方法,我最喜欢的是使用JSON:

if ( JSON.stringify(a) == JSON.stringify(b) ) {
    // equal

请注意,将预先存在的对象分配给变量就像在编写b = a时一样,只是复制引用。它们都指向同一个数组。

您必须b = a.slice()才能获得真实副本。

答案 3 :(得分:2)

像您编写的JavaScript数组比较只是简单的对象引用比较。它们不是逐个“深入”的比较。

您可以编写自己的比较函数,根据您的需要,检查长度是否相同以及元素是否相同(无论是否顺序)。 编辑正如其他人所指出的,有几个库包含数组比较函数。如果你发现一个符合你的“平等”定义(并非不可能),并且你不介意考虑将该库纳入你的架构,那可能是个好主意。