2012-12-05 43 views
7

Tôi có một vài vị trí trong mã của mình, nơi tôi cần lặp qua chuỗi và thực hiện char hoạt động theo char. Ứng dụng node.js của tôi cần phải thực hiện hàng chục lần cho mỗi yêu cầu và thường độ dài của các chuỗi có thể khá dài.Lặp lại một chuỗi trong coffeescript mà không cần phải tạo một mảng

Cách duy nhất tôi đã nhìn thấy để chuyển đổi một javascript như dưới đây vào coffeescript là tạo ra một mảng dựa trên độ dài của chuỗi. Vấn đề với điều này, tôi có thêm một điều để làm ở phần cứng, chiếm thêm bộ nhớ, và dường như không cần thiết (ứng dụng nút của tôi xử lý dgrams - lên tới hàng nghìn giây - vì vậy tất cả công việc phụ này đều tăng thêm).

Cách JavaScript:

for(var i = 0; i < str.length; i++) { /* Do stuff with str here */ } 

Các gợi ý CoffeeScript cách

for i in [0..str.length] 
    # Do stuff here 

Một lần nữa, tôi nghĩ rằng đó là ngớ ngẩn để buộc việc tạo ra một đối tượng mảng khi truyền thống vòng lặp for doesn không phải gây rối với bước đó từ góc độ phần cứng.

công việc duy nhất của tôi xung quanh tôi đã tìm thấy là sử dụng vòng lặp while như:

i = 0 
while i < str.length 
    # Do stuff 
    i++ 

Trong khi làm việc, đó là nhiều tiết hơn ngay cả những cách Javascript thẳng vì chỉ sử dụng một đơn giản cho vòng lặp.

Có cách nào để sử dụng vòng lặp for trong CoffeeScript mà không phải tạo mảng không cần thiết để thực hiện lặp lại cơ bản không?

+0

Tại sao lặp qua một chuỗi? Có gì sai với cách đầu tiên? – Christoph

+2

@Christoph tại sao * không * lặp qua chuỗi? Có lẽ anh ta đang phân tích nó. – Pointy

+1

Làm thế nào để bạn có nghĩa là _ "mà không cần phải tạo ra các mảng thừa" _? Bạn chỉ có thể sử dụng một chuỗi như thể nó là một mảng: 'console.log (" Hello world "[7]);' – Cerbrus

Trả lời

13

Nó không thực sự tạo ra một mảng nếu nó không phải. Nhìn vào JS đã biên dịch. CoffeeScript này:

str = "hello" 
for i in [0..(str.length-1)] 
    alert(i) 

Tạo JavaScript sau:

var i, str, _i, _ref; 

str = "hello"; 

for (i = _i = 0, _ref = str.length - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) { 
    alert(i); 
} 

Không mảng đã thực sự tạo ra.

(Trừ 1 tới .length để tránh không xác định)

+2

Đánh tôi với nó: D. @Dan để tham khảo trong tương lai, trang "Thử" trên trang web coffeescript có thể tốt cho những ví dụ thế hệ một lần – gerges

+1

Ồ, tôi chưa bao giờ thấy một vòng lặp 'for' lớn cho một cái gì đó đơn giản oO – Cerbrus

+2

@Cerbus coffeescript iteration với cú pháp đó là hai chiều, và trình biên dịch sẽ không biết tại thời điểm này nếu "0 đến arg" đang đếm lên hoặc xuống. Với việc bao gồm "by 1" bạn có thể đầu mối trình biên dịch vào một số tích cực tạo ra một cái gì đó bạn có khả năng sử dụng nhiều hơn để. 'for i in [0..str.length] bởi 1' – gerges

2

Trong JavaScript (Và do đó, cũng CoffeeScript), strings thể được truy cập như bạn muốn truy cập arrays:

console.log("Hello world".length);       // returns "11" 
console.log("Hello world"[6]);   // returns "o" 
console.log("Hello world".indexOf("w")); // returns "6" 

Tôi không thấy bạn khởi tạo mảng trong bất kỳ của những vòng lặp.

Bạn sẽ có thể sử dụng JavaScript đơn giản trong tệp CoffeeScript, tuy nhiên, nếu điều đó giải quyết được vấn đề.

+1

Hoặc đối với các trình duyệt cũ có phương thức charAt() ... – nnnnnn

5

Bạn cũng có thể lặp qua chuỗi chính nó:

for ch, i in str 
    # Do stuff here. 
+1

Tốt. Từ vòng lặp 'for' chỉ phụ thuộc vào' str' có thuộc tính 'length' và xử lý' str [] '. –

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