表达方式
[1, 2, 3] == [1, 2, 3]
false
在Coffeescript中计算结果为,但是否有一种简洁、惯用的方法来测试数组是否相等?
表达方式
[1, 2, 3] == [1, 2, 3]
false
在Coffeescript中计算结果为,但是否有一种简洁、惯用的方法来测试数组是否相等?
如果您正在处理数字数组,并且您知道数组中没有空值或未定义值,则可以将它们作为字符串进行比较:
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。
如果您不介意引入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 )
我不认为这是惯用的,但这将是一种无需添加额外库的方式:
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}"
以下效果很好,不需要依赖:
arrayEqual = (ar1, ar2) ->
JSON.stringify(ar1) is JSON.stringify(ar2)
我是Sugar.js的忠实粉丝。如果您碰巧正在使用它:
a = [1, 2, 3]
b = [1, 2, 3]
Object.equal(a, b)
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