23

表达方式

[1, 2, 3] == [1, 2, 3]

falseCoffeescript中计算结果为,但是否有一种简洁、惯用的方法来测试数组是否相等?

4

6 回答 6

15

如果您正在处理数字数组,并且您知道数组中没有空值或未定义值,则可以将它们作为字符串进行比较:

a = [1, 2, 3]
b = [1, 2, 3]

console.log "#{a}" is "#{b}" # true
console.log '' + a is '' + b # true

但是请注意,一旦您开始比较其他非数字的数组,这将中断:

a = [1, 2, 3]
b = ['1,2', 3]

console.log "#{a}" is "#{b}" # true

如果您想要一个更强大的解决方案,您可以使用Array#every

arrayEqual = (a, b) ->
  a.length is b.length and a.every (elem, i) -> elem is b[i]

console.log arrayEqual [1, 2, 3], [1, 2, 3]   # true
console.log arrayEqual [1, 2, 3], [1, 2, '3'] # false
console.log arrayEqual [1, 2, 3], ['1,2', 3]  # false

请注意,它首先比较数组的长度,因此arrayEqual [1], [1, 2, 3]不会返回 true。

于 2012-06-21T17:53:40.300 回答
6

如果您不介意引入Underscore.js依赖项,您可以使用其中的一些实用程序。它不是非常优雅,但我想不出用普通的咖啡脚本更简单的方法:

a = [ 1, 2, 3 ]
b = [ 1, 2, 3 ]
equal = a.length == b.length and _.all( _.zip( a, b ), ([x,y]) -> x is y )
于 2012-06-21T16:44:53.427 回答
4

我不认为这是惯用的,但这将是一种无需添加额外库的方式:

a = [1, 2, 3, 4]
b = [22, 3, 4]

areEqual = true
maxIndex = Math.max(a.length, b.length)-1
for i in [0..maxIndex]
    testEqual = a[i] is b[i]
    areEqual = areEqual and testEqual

console.log areEqual

更简洁的方法是使用 JavaScript 的reduce()函数。这有点短,但我不确定所有浏览器都支持减少。

a = [1, 3, 4, 5]
b = [1, 3, 4, 5]

maxIndex = Math.max(a.length, b.length)-1
areEqual = true
[0..maxIndex].reduce (p, c, i, ar) -> areEqual = areEqual and (a[i] is b[i])

console.log "areEqual=#{areEqual}"
于 2012-06-21T17:47:26.443 回答
3

以下效果很好,不需要依赖:

arrayEqual = (ar1, ar2) ->
  JSON.stringify(ar1) is JSON.stringify(ar2)
于 2013-12-19T09:44:16.197 回答
0

我是Sugar.js的忠实粉丝。如果您碰巧正在使用它:

a = [1, 2, 3]
b = [1, 2, 3]
Object.equal(a, b)
于 2013-01-23T07:55:49.047 回答
0

true如果数组具有相同的长度并且具有相同索引的所有值具有相同的值,则此函数返回。如果任一参数不是数组,则会引发错误。

isArray = Array.isArray || (subject) ->
    toString.call(subject) is '[object Array]'

compareArrays = (a, b) ->
    unless isArray(a) and isArray b
        throw new Error '`arraysAreEqual` called with non-array'

    return false if a.length isnt b.length

    for valueInA, index in a
        return false if b[index] isnt valueInA

    true
于 2014-03-10T08:15:23.437 回答