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

Sha*_*awn 9 javascript arrays comparison

看看这个代码示例或转到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');
Run Code Online (Sandbox Code Playgroud)

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

RKu*_*her 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
Run Code Online (Sandbox Code Playgroud)

UPDATE

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

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

在两个对象之间执行优化的深度比较,以确定它们是否应被视为相等.

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

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

object === other;
// => false
Run Code Online (Sandbox Code Playgroud)

  • 请注意,顺序在数组中很重要,所以`_.isEqual([1,2,3],[3,2,1])=> false (6认同)

Ste*_*all 12

使用lodash.

_.isEqual([1,2],[1,2])
Run Code Online (Sandbox Code Playgroud)

也适用于对象.

_.isEqual({a:1}, {a:1})
Run Code Online (Sandbox Code Playgroud)


Dav*_*ing 7

数组是javascript中的对象.并且比较对象不能==像使用比较字符串或数字时通常使用的那样进行.

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

if ( JSON.stringify(a) == JSON.stringify(b) ) {
    // equal
Run Code Online (Sandbox Code Playgroud)

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

你需要做b = a.slice()一个真正的副本.


Poi*_*nty 2

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

您可以编写自己的比较函数,用于检查长度是否相同以及元素是否相同(无论是否按顺序),以满足您的需要。编辑正如其他人指出的那样,有几个库包含数组比较函数。如果您找到一个符合您对“平等”定义的库(并非不可能),并且您不介意考虑将该库合并到您的架构中,那么这可能是一个好主意。

  • “你自己写吧。” 基督。不。 (2认同)