2013-03-08 36 views
7

Tôi muốn tạo hai mảng b và c cùng một lúc. Tôi biết hai phương pháp có thể đạt được nó. Phương pháp đầu tiên làLàm thế nào để tạo hai mảng trong cùng một vòng lặp với CoffeeScript?

b = ([i, i * 2] for i in [0..10]) 
c = ([i, i * 3] for i in [0..10]) 

alert "b=#{b}" 
alert "c=#{c}" 

Phương pháp này rất hữu ích để tạo chỉ một mảng. Tôi không thể là cách tốt hơn để có được hiệu suất tốt hơn cho tính toán.

Phương pháp thứ hai là

b = [] 
c = [] 
for i in [0..10] 
    b.push [i, i*2] 
    c.push [i, i*3] 

alert "b=#{b}" 
alert "c=#{c}" 

phương pháp này có vẻ tốt cho hiệu quả tính toán nhưng hai dòng b = [] c = [] phải được viết đầu tiên. Tôi không muốn viết 2 dòng này nhưng tôi không tìm được câu trả lời hay. Nếu không có khởi tạo cho các mảng của b và c, chúng ta không thể sử dụng phương thức push.

Có tồn tại toán tử tồn tại? trong Coffeescript nhưng tôi không biết nóng để sử dụng nó trong vấn đề này. Bạn có phương pháp tốt hơn để tạo mảng b và c không có khởi tạo rõ ràng không?

Cảm ơn bạn!

+0

có thể 'b = c = []' sẽ phù hợp hơn? – varnie

+0

Cảm ơn. Bạn sẽ nhận được kết quả tương tự cho b và c. Câu trả lời là sai. –

+1

@varnie: Không, các mảng cần phải tách biệt và nội dung của chúng khác nhau. –

Trả lời

1

Làm thế nào về vấn đề này bằng cách sử dụng toán tử hiện sinh:

for i in [0..10] 
    b = [] if not b?.push [i, i*2] 
    c = [] if not c?.push [i, i*3] 

console.log "b=#{b}" 
console.log "c=#{c}" 

Hoặc để dễ hiểu hơn một chút:

for i in [0..10] 
    (if b? then b else b = []).push [i, i*2] 
    (if c? then c else c = []).push [i, i*3] 

console.log "b=#{b}" 
console.log "c=#{c}" 

EDIT: từ nhận xét:

OK nhưng bạn bạn phải viết rất nhiều mã tẻ nhạt. Lý do tương tự là cũng cho `(b = b hoặc []). Đẩy [i, i * 2]

Đó là tẻ nhạt, vì vậy chúng tôi có thể bọc nó trong một hàm (nhưng hãy cẩn thận các biến sẽ toàn cầu hiện nay):

# for node.js 
array = (name) -> global[name] = global[name] or [] 

# for the browser 
array = (name) -> window[name] = window[name] or [] 

for i in [0..10] 
    array('b').push [i, i*2] 
    array('c').push [i, i*3] 

console.log "b=#{b}" 
console.log "c=#{c}" 
+0

OK nhưng bạn phải viết rất nhiều mã tẻ nhạt. Lý do tương tự cũng là cho '(b = b hoặc []). Đẩy [i, i * 2]' –

+0

Tôi đã cập nhật câu trả lời bằng một tùy chọn khác –

+1

Quá phức tạp. Vẫn không có cách nào tốt hơn là khởi tạo chúng riêng biệt với 'b = []' và 'c = []'. Tôi tự hỏi nếu có một số cách mà có thể kết hợp các phương pháp 1 và 2 như tôi đã đề cập.Có lẽ chúng ta có thể cần sửa đổi định nghĩa cho phương thức push cho mảng để làm cho nó có giá trị ban đầu. –

4

Bạn có thể sử dụng một chút giúp đỡ từ underscore (hoặc bất kỳ lib khác cung cấp chức năng zip -like):

[b, c] = _.zip ([[i, i * 2], [i, i * 3]] for i in [0..10])... 

Sau khi thực hiện nó, chúng ta có:

coffee> b 
[ [ 0, 0 ], 
    [ 1, 2 ], 
    [ 2, 4 ], 
    [ 3, 6 ], 
    [ 4, 8 ], 
    [ 5, 10 ], 
    [ 6, 12 ], 
    [ 7, 14 ], 
    [ 8, 16 ], 
    [ 9, 18 ], 
    [ 10, 20 ] ] 

coffee> c 
[ [ 0, 0 ], 
    [ 1, 3 ], 
    [ 2, 6 ], 
    [ 3, 9 ], 
    [ 4, 12 ], 
    [ 5, 15 ], 
    [ 6, 18 ], 
    [ 7, 21 ], 
    [ 8, 24 ], 
    [ 9, 27 ], 
    [ 10, 30 ] ] 

Xem section about splats trong tài liệu CoffeeScript để biết thêm chi tiết và ví dụ.

+0

Rất thú vị nhưng nó thực sự là một thách thức. Tôi không có câu trả lời đúng với nó. Cảm ơn bạn. –

+0

Tôi đã cập nhật câu trả lời của mình với kết quả tôi nhận được. nó có sai không? –

+0

Cảm ơn rất nhiều. Tôi cũng có kết quả tương tự. Tôi quên ba dấu chấm ở cuối dòng. Tôi đã không thực sự hiểu rõ cách sử dụng của ba dấu chấm. Cảm ơn nhiều. –

Các vấn đề liên quan