Có thể truy cập chỉ mục trong một Hash mỗi vòng lặp?


119

Tôi có lẽ đang thiếu một cái gì đó rõ ràng, nhưng có cách nào để truy cập chỉ số / số lần lặp bên trong băm mỗi vòng lặp không?

hash = {'three' => 'one', 'four' => 'two', 'one' => 'three'}
hash.each { |key, value| 
    # any way to know which iteration this is
    #   (without having to create a count variable)?
}

3
Anon: Không, hàm băm không được sắp xếp.
Mikael S

Các hàm băm không được sắp xếp về mặt kỹ thuật, nhưng với ruby, bạn có thể sắp xếp chúng theo một nghĩa nào đó. sort () sẽ chuyển đổi chúng sang một sắp xếp mảng lồng nhau, sau đó bạn có thể chuyển đổi trở lại một băm: your_hash.sort.to_h
jlesse

Câu trả lời:


296

Nếu bạn muốn biết Chỉ mục của mỗi lần lặp, bạn có thể sử dụng .each_with_index

hash.each_with_index { |(key,value),index| ... }

24
cụ thể:hash.each_with_index { |(key,value),index| ... }
rapter

22
parens là cần thiết b / c hash.eachcho mỗi cặp khóa-giá trị trong một Array. Các parens làm điều tương tự như (key,value) = arrđặt giá trị đầu tiên (khóa) vào keyvà giá trị thứ hai vào value.
rapter

1
Cảm ơn @ S.Mark, @raosystem, điều đó đã hiệu quả. Tôi không thấy each_with_indexđược liệt kê trong RDoc cho Hash: ruby-doc.org/core/classes/Hash.html . Bây giờ tôi thấy rằng đó là một thành viên của Enumerable. Nhưng quá tệ là RDoc không thể tham chiếu chéo each_with_indextừ Hash.html.
Nâng cấp

2
@Dave_Paroulek Tôi cũng thường ước như vậy. Tôi thấy việc kiểm tra các mô-đun mẹ theo cách thủ công là một bước cần thiết khi sử dụng vi để kiểm tra các phương thức của một lớp. Thường thì tôi chỉ bỏ qua irbvà sử dụng ClassName#instance_methodsđể đảm bảo không có gì tôi bỏ lỡ.
rapter

Thx, @raosystem, ClassName#instance_methodsđã rất hữu ích
Nâng cấp

11

Bạn có thể lặp lại các khóa và lấy các giá trị ra theo cách thủ công:

hash.keys.each_with_index do |key, index|
   value = hash[key]
   print "key: #{key}, value: #{value}, index: #{index}\n"
   # use key, value and index as desired
end

CHỈNH SỬA: theo nhận xét của raosystem, tôi cũng vừa biết rằng bạn có thể nhận được cả khóa và giá trị dưới dạng một bộ giá trị nếu bạn lặp lại hash:

hash.each_with_index do |(key, value), index|
   print "key: #{key}, value: #{value}, index: #{index}\n"
   # use key, value and index as desired
end

Bị phản đối vì truy cập bộ sưu tập được lặp lại từ bên trong vòng lặp và mã sai: keytrong vòng lặp đầu tiên là một mảng của cặp khóa + giá trị, vì vậy việc sử dụng nó làm chỉ mục trong hashlà sai. Bạn đã bao giờ thử nghiệm nó chưa?
SasQ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.