23

表現

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

はCoffeescriptで評価さfalseれますが、配列の等価性をテストするための簡潔で慣用的な方法はありますか?

4

6 に答える 6

15

数値の配列を扱っていて、配列にnullや未定義の値がないことがわかっている場合は、それらを文字列として比較できます。

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()関数を使用することです。これは少し短いですが、すべてのブラウザーが 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 に答える