0%

JS 测试 array 是否相等

首先判断两个数组是否相等时不能直接使用 ==

1
2
3
var array1 = []
var array2 = []
console.log(array1 == array2) //输出false

对于对象来说,== 比较的是两个对象是否为同一个对象。数组属于对象类型,尽管数组元素是相同的,但这两个数组属于不同的对象,所以 == 比较为false.


四种比较方式

  1. 数组简单比较
    如果数组里的元素是标量,非 object 类型,可以使用 == 比较数组里的元素:

    1
    2
    3
    scalarArrayEquals(array1,array2) {
    return array1.length==array2.length && array1.every(function(v,i) { return v === array2[i]})
    }
  2. 嵌套数组比较
    如果数组是多层嵌套,数组的基本元素也为标量。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    arrayEquals(array1, array2) {
    if(!(array1 || array1)) {
    return false
    }
    // 先比较长度
    if (array1.length != array2.length)
    return false

    for (var i = 0, l=array1.length; i < l; i++) {
    // 检查是否为内嵌数组
    if (array1[i] instanceof Array && array2[i] instanceof Array) {
    // 递归比较数组
    if (!arrayEquals(array1[i],array2[i]))
    return false
    } else if (this[i] != array[i]) { //标量比较
    return false
    }
    }
    return true
    }
  3. Lodash 或 Underscore 比较数组(推荐)
    如果数组的元素可能为 object,可以考虑使用 Lodash 或者 Underscore。它们已经实现了对象的深度比较,包括数组。
    使用 Lodash 或 Underscore 比较数组或对象很简单:

    1
    2
    _.isEqual(array1, array2)   //相等返回true,否则返回false
    _.isEqual(object1, object2) //
  4. 转为字符串比较数组
    除了上面的比较方法外,还可以把数组转换为字符串后,比较字符串。

    array1.toString() === array2.toString()

    或者

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

    但相对上面几种方式,转换为字符串后再比较的性能是比较差的。其中以 JSON 转换为字符串的性能最差。