2013-05-06 10 views
18

Tôi đã bật cờ Chrome cho các tính năng ECMAscript 6 thử nghiệm, một trong số đó là Set. Theo tôi hiểu, các chi tiết của Set được thống nhất rộng rãi bởi các nhà văn cụ thể.Lặp lại các phần tử đã đặt

tôi có thể tạo một tập a và thêm chuỗi 'Hello'

a = Set(); 
a.add('Hello'); 

nhưng làm thế nào để lặp qua các yếu tố của a?

for(let i of a) { console.log(i); } 

cho "Lỗi Cú pháp: bất hợp pháp let khai chế độ bên ngoài mở rộng"

for(var i of a) { console.log(i); } 

cho "Lỗi Cú pháp: định danh bất ngờ"

for(var i in a) { console.log(i); } 

cho Undefined

Có thể lặp trên một bộ trong Chrome 26?

+2

[Có vẻ giống như của] (http: //kangax.github.io/es5-compat-table/es6) chỉ được hỗ trợ trong Firefox hiện tại ... –

+0

[Cách triển khai Bộ trong JavaScript] (http://www.javascriptexamples.org/2011/01/17/how-to- implement-a-set-in-javascript /) – NullPointerException

+0

bạn có thể sử dụng điều này: http://jsclass.jcoglan.com/set.html –

Trả lời

2

Nhà điều hành ofdoesn't appear to be currently supported in Chrome. Dường như chỉ có các phiên bản FireFox từ 13 đến 18 hỗ trợ nó. Nó cũng xuất hiện rằng không có trình duyệt nào thực sự hỗ trợ Set mặc dù trang có nói rằng một số thử nghiệm thể hiện sự tồn tại và không có đầy đủ chức năng hoặc tính mạch lạc. Vì vậy, có thể là Set được triển khai một phần trong Chrome.

4

Ngay cả khi đường cú pháp để lặp lại chưa được triển khai, bạn có thể vẫn sử dụng trình vòng lặp.

http://www.2ality.com/2012/06/for-of-ff13.html giải thích

The special method __iterator__ returns an iterator object. Such an object has a method next() that either returns the next element in the current iteration sequence or throws StopIteration if there are no more elements.

Vì vậy, bạn sẽ có thể duyệt qua các thiết lập sử dụng

for (var it = mySet.__iterator__();;) { 
    var element; 
    try { 
    element = it.next(); 
    } catch (ex) { 
    if (ex instanceof StopIteration) { 
     break; 
    } else { 
     throw ex; 
    } 
    } 
    // Do something with element 
} 

Bạn cũng có thể xác định một phiên bản chức năng của cho & hellip; giống như

function forOf(collection, f) { 
    // jQuery.each calling convention for f. 
    var applyToElement = f.bind(/* this */ collection, /* index */ void 0); 
    for (var it = mySet.__iterator__();;) { 
    var element; 
    try { 
     element = it.next(); 
    } catch (ex) { 
     if (ex instanceof StopIteration) { 
     break; 
     } else { 
     throw ex; 
     } 
    } 

    // jQuery.each return convention. 
    if (applyToElement(element) === false) { break; } 
    } 
} 
+1

Cảm ơn. Dù vậy, nó hơi xấu hổ. – Randomblue

+3

@Randomblue, Yeah. Đường cú pháp có nghĩa là để che đậy tất cả điều đó, nhưng thường những người khác nhau thực hiện hỗ trợ cú pháp trong trình phân tích cú pháp hơn là triển khai mã thư viện để bạn có được bản phát hành với một nửa tính năng. Khi cú pháp của bạn bị chậm lại, bạn chỉ cần tự mình sửa nó, cái mà đòi hỏi phải xem cách làm xúc xích. –

+0

Không có phương thức '__iterator__' nào trong Node v0.11.4 mới nhất. – Randomblue

8

Tôi sử dụng hàm forEach(..);.

4

Khi spec từ MDN, Set có một phương pháp values:

The values() method returns a new Iterator object that contains the values for each element in the Set object in insertion order.

Vì vậy, ví lặp qua các giá trị, tôi sẽ làm:

var s = new Set(['a1', 'a2']) 
for (var it = s.values(), val= null; val=it.next().value;) { 
    console.log(val); 
} 
+0

Khi lặp lại thì dừng lại? Theo tài liệu, StopIteration sẽ bị ném. Sử dụng một ngoại lệ để dừng lặp lại là một giải pháp khủng khiếp. –

+0

Nếu bạn đang đề cập đến tài liệu MDN về Iterator, tôi không chắc liệu tài liệu của họ có còn chính xác không, chúng cũng có Cảnh báo trên trang. Trình vòng lặp sẽ ngừng tiến lên khi nó đạt đến kết thúc. – bizi

0

@bizi's answer gần nhưng nó đã không làm việc cho tôi. Điều này làm việc trên Firefox:

var s= new Set([1,2]), 
    it = s.values(); 
for (var val= it.next().value; val=it.next().value;) { 
    console.log("set: "+val); 
} 
4

Một cách rất dễ dàng là để biến Set vào một mảng đầu tiên:

let a = Set(); 
a.add('Hello'); 
a = Array.from(a); 

... và sau đó chỉ cần sử dụng một đơn giản cho vòng lặp.

+0

Ngoài ra, nó có tham số thứ hai, tùy chọn là một hàm ánh xạ để gọi trên mọi phần tử, tức là: 'a = Array.from (a, e => e.length)'. – Adamantium