2013-04-23 40 views
75

Trong mã của tôi, tôi có một vài từ điển (như được gợi ý here) là Chuỗi được lập chỉ mục. Do đây là một chút của một loại ngẫu hứng, tôi đã tự hỏi nếu có bất kỳ lời đề nghị về cách tôi sẽ có thể lặp qua mỗi khóa (hoặc giá trị, tất cả tôi cần các phím cho anyway). Bất kỳ trợ giúp nào được đánh giá cao!TypeScript, Lặp qua từ điển

myDictionary: { [index: string]: any; } = {}; 
+0

Bạn đã thử: 'for (var key in myDictionary) {}'? Bên trong vòng lặp, bạn sẽ sử dụng 'khóa' để lấy khóa và' myDictionary [key] 'để lấy giá trị – Ian

+0

@Ian Chỉ cần thử điều đó, dường như không hoạt động. Không có lỗi, nhưng không có gì chạy trong tuyên bố – ben657

+1

@Ian Ah xin lỗi, một số mã ở nơi khác đã gây rối với nó. Điều đó hoạt động hoàn hảo! Chăm sóc để làm cho nó một câu trả lời để tôi có thể chọn nó? – ben657

Trả lời

117

Để lặp qua khóa/giá trị, sử dụng một vòng lặp for in:

for (let key in myDictionary) { 
    let value = myDictionary[key]; 
    // Use `key` and `value` 
} 
+0

Phải sử dụng "khóa" làm tên biến? – Yiping

+2

@Yiping Không, nhưng nó giúp làm cho nó rõ ràng cho tôi – Ian

+2

Điều này không an toàn nói chung; nó cần kiểm tra hasOwnProperty (như trong câu trả lời của Jamie Stark) hoặc cái gì khác. –

33

Có một caveat đến vòng chìa khóa/giá trị mà Ian nói. Nếu có thể là các đối tượng có thể có thuộc tính gắn liền với Prototype của họ, và khi bạn sử dụng toán tử in, các thuộc tính này sẽ được bao gồm. Vì vậy, bạn sẽ muốn đảm bảo rằng khóa là một thuộc tính của cá thể của bạn, và không phải của nguyên mẫu. Các trình duyệt IE cũ hơn được biết là có một số indexof(v) hiển thị dưới dạng khóa.

for (var key in myDictionary) { 
    if (myDictionary.hasOwnProperty(key)) { 
     var value = myDictionary[key]; 
    } 
} 
+2

Không cố gắng chia tóc, nhưng vì chúng ta đang nói kịch bản kiểu, bạn không nên dùng phím thay vì phím var? Câu trả lời tốt đẹp cảm ơn bạn. –

+1

Thực tế, với phiên bản hiện tại của kịch bản kiểu, 'khóa' và' giá trị' có thể là 'const'. –

41

@Alcesem đã có nó gần như ngay lập ngoại trừ việc vì lợi ích của phương pháp đó là người ta không cần phải bao gồm bảo vệ hasOwnProperty() với Object.keys vì iterator sẽ không tìm kiếm thêm lên chuỗi nguyên mẫu. Vì vậy, sau đây không chỉ an toàn cho các từ điển, mà là bất kỳ loại đối tượng nào trong cả hai loại và Javascript.

< ES 2017:

Object.keys(obj).forEach(key => { 
    let value = obj[key]; 
}); 

> = ES 2017:

Object.entries(obj).forEach(
    ([key, value]) => console.log(key, value) 
); 
+0

Đây là giải pháp tôi đang tìm kiếm vì nó sẽ cho phép tôi sắp xếp các khóa trước khi lặp lại – Andrew

+0

FYI, điều này không được hỗ trợ trên sân chơi TypeScript tại thời điểm này. – Seanny123

+1

Xem [ở đây] (http://stackoverflow.com/a/39815452/968003) cách làm cho 'Object.entries' hoạt động trong TypeScript –

8

Làm thế nào về điều này?

for (let [key, value] of Object.entries(obj)) { 
    ... 
} 
Các vấn đề liên quan