2012-06-21 32 views
22

Khái niệmCó cách nào thành ngữ để kiểm tra sự bình đẳng mảng trong Coffeescript không?

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

đánh giá để false trong Coffeescript nhưng là có một, cách thành ngữ súc tích để kiểm tra bình đẳng mảng?

+0

Tôi không biết nhiều về coffeescript, nhưng bạn dường như đang thử nghiệm sự bình đẳng của các đối tượng với '==' thay vì giá trị mảng riêng lẻ. –

+5

ai đó cần lưu ý ở đây rằng '== 'trong coffeescript được evauated để' === 'trong javascript. – SirLenz0rlot

Trả lời

14

Nếu bạn đang đối phó với mảng các con số, và bạn biết rằng không có null hay giá trị không xác định trong mảng, bạn có thể so sánh chúng như dây đàn:

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

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

Thông báo, tuy nhiên, điều này sẽ phá vỡ ngay sau khi bạn bắt đầu mảng so sánh những thứ khác mà không phải là con số:

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

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

Nếu bạn muốn có một giải pháp mạnh mẽ hơn, bạn có thể sử dụng 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 

Lưu ý rằng lần đầu tiên so sánh độ dài của mảng sao cho arrayEqual [1], [1, 2, 3] không trả về giá trị đúng.

+2

Tôi thích Array :: mọi giải pháp nhưng IIRC không hỗ trợ phương pháp trong IE <9 (vâng, tôi ước tôi không phải quan tâm, nhưng ...) –

+3

@PirateRob Yeah, đó có thể là một vấn đề. Cá nhân tôi ngừng nhận xét "hãy cẩn thận rằng điều này có thể không hoạt động trong IE" bởi vì rất nhiều lần nó không có ý nghĩa; có rất nhiều phát triển JS di động, Node.js và whatnot, vì vậy, không có thông tin trước đó tôi sẽ không bình luận về khả năng tương thích của IE. Nếu bạn _do_ cần phải quan tâm đến IE nhưng sẽ vẫn sử dụng những thứ JS mới hơn, bạn có thể làm suy giảm một chút kinh nghiệm của người dùng IE chỉ và có điều kiện bao gồm một "shim", giống như [es5-shim] (https://github.com)/kriskowal/es5-shim /), đối với tất cả những tính năng này :) – epidemian

+0

Ngoài ra, bạn có thể sử dụng tính năng triển khai ['every'] của Underscore (http://underscorejs.org/#all), đảm bảo khả năng tương thích giữa các trình duyệt cho một chi phí rất thấp :) – epidemian

6

Nếu bạn không nhớ giới thiệu phụ thuộc Underscore.js, bạn có thể sử dụng một số tiện ích của nó. Nó không phải ồ ạt thanh lịch, nhưng tôi không thể nghĩ ra một cách dễ dàng hơn để làm điều đó với coffeescript đồng bằng:

a = [ 1, 2, 3 ] 
b = [ 1, 2, 3 ] 
equal = a.length == b.length and _.all(_.zip(a, b), ([x,y]) -> x is y) 
+3

Chỉ có cải tiến mà tôi có thể nghĩ là sử dụng phép gán hủy của coffeescript: '_.all (x là y cho [x, y] trong _.zip (a, b))' – Trevor

+0

Hãy coi chừng rằng ['_.all'] (http://underscorejs.org/#all) _needs_ một hàm lặp. Ví dụ này [break] (http://jsfiddle.net/W5THS/) cho tôi trong cả Firefox và Chrome như bây giờ ("iterator không phải là một hàm" được ném trong FF). May thay, thật dễ dàng để [sửa lỗi] (http://jsfiddle.net/W5THS/1/): '_.all _.zip (a, b), ([x, y]) -> x là y' :) – epidemian

+0

Thật không may, sử dụng '_.zip' sẽ làm cho giải pháp này so sánh' [1, 2, 3, undefined] 'và' [1, 2, 3] '[bằng nhau] (http://jsfiddle.net)/W5THS/2 /) :( – epidemian

3

Tôi sẽ không xem xét thành ngữ này, nhưng đây sẽ là một cách để làm việc đó mà không cần thêm một thư viện thêm :

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 

Phương pháp tiếp cận rõ ràng hơn sẽ sử dụng chức năng reduce() của JavaScript. Đây là một chút ngắn hơn nhưng tôi không chắc chắn tất cả các trình duyệt hỗ trợ giảm.

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}" 
0

Tôi là người hâm mộ lớn của Sugar.js. Nếu bạn tình cờ được sử dụng rằng:

a = [1, 2, 3] 
b = [1, 2, 3] 
Object.equal(a, b) 
3

Sau đây hoạt động tuyệt vời và không cần phụ thuộc:

arrayEqual = (ar1, ar2) -> 
    JSON.stringify(ar1) is JSON.stringify(ar2) 
+0

Điều này làm việc tuyệt vời cho các đối tượng, quá. –

0

Hàm này trả true nếu mảng có cùng chiều dài và tất cả các giá trị với cùng một chỉ số có cùng một giá trị. Nó ném một lỗi nếu một trong hai đối số không phải là một mảng.

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 
Các vấn đề liên quan