Tôi muốn chọn (các) yếu tố từ mảng bao gồm (s) từ 'tốt' và đặt chuỗi thành biến mới. Làm thế nào tôi có thể làm điều này?Thay đổi tất cả các phần tử mảng bao gồm một chuỗi cụ thể
Trả lời
Nó gần như bạn đã gõ tiêu đề của bạn:
array.select {|s| s.include? "good"}
Đây là doc: http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-select
Ngoài ra còn có một phương pháp đặc biệt cho việc này:
array.grep(/good/) # => ["Ham is good"]
Với #grep bạn có thể làm một rất nhiều vì biểu thức chính quy ...
Vì không trả lời cho đến nay hướng dẫn bạn cách cập nhật chuỗi trong mảng với giá trị mới, dưới đây là một số tùy chọn:
# Find every string matching a criteria and change them
array.select{ |s| s.include? "good" }.each{ |s| s.replace("bad") }
# Find every string matching a pattern and change them
array.grep.replace("bad").each{ |s| s.replace("bad") }
# Find the first string matching a criteria and change it
array.find{ |s| s =~ /good/ }.replace("bad")
Tuy nhiên, tất cả những điều trên sẽ thay đổi mọi trường hợp của chuỗi. Ví dụ:
jon = Person.new "Johnny B. Goode"
array = [ jon.name, "cat" ]
array.find{ |s| s =~ /good/i }.replace("bad")
p array #=> "bad"
p jon #=> #<Person name="bad"> Uh oh...
Nếu bạn không muốn bên này có hiệu lực-nếu bạn muốn thay thế các chuỗi trong mảng với một khác nhau chuỗi, nhưng không thay đổi chuỗi riêng của mình-thì bạn cần phải tìm ra chỉ số của mặt hàng đó và cập nhật rằng:
# Find the _first_ index matching some criteria and change it
array[ array.index{ |s| s =~ /good/ } ] = "bad"
# Update _every_ item in the array matching some criteria
array[i] = "bad" while i = array.index{ |s| s =~ /good/i }
# Another way to do the above
# Possibly more efficient for very large arrays any many items
indices = array.map.with_index{ |s,i| s =~ /good/ ? i : nil }.compact
indices.each{ |i| array[i] = "bad" }
Cuối cùng, đơn giản nhất và hầu hết là nhanh nhất, mà không mucking về với chỉ số:
# Create a new array with the new values
new_array = array.map do |s|
if s =~ /good/i # matches "Good" or "good" in the string
"bad"
else
s
end
end
# Same thing, but shorter syntax
new_array = array.map{ |s| s =~ /good/i ? "bad" : s }
# Or, change the array in place to the new values
new_array = array.map!{ |s| s =~ /good/i ? "bad" : s }
map!
giống như một lựa chọn tốt.
x = ['i', 'am', 'good']
def change_string_to_your_liking s
# or whatever it is you plan to do with s
s.gsub('good', 'excellente!')
end
x.map! {|i| i =~ /good/ ? change_string_to_your_liking(i) : i}
puts x.inspect
Câu trả lời hay, nhưng lưu ý rằng OP không bao giờ nói bất cứ điều gì về việc thay đổi chuỗi ('gsub'), nhưng thay thế nó bán buôn. – Phrogz
@Phrogz câu hỏi là rất không rõ ràng về những gì nên được thiết lập để những gì – maprihoda
Maprihoda là chính xác. OP nói 'đặt chuỗi thành biến mới'. Đối với tất cả chúng ta biết rằng có thể có nghĩa là tạo ra một giá trị số nguyên từ chuỗi. Nó thực sự có thể yêu cầu thay thế, nhưng điều này không được nêu rõ. Do sự mơ hồ, tôi đã không đưa ra giả định về ý định chính xác của sửa đổi biến và cung cấp một phương thức có nội dung có thể dễ dàng được sửa đổi theo ý thích của mình. Lưu ý tên của phương thức 'change_string_to_your_liking' và chú thích' # hoặc bất cứ điều gì bạn định làm với s'. – kikuchiyo
- 1. Cách chọn tất cả các phần tử sau phần tử cụ thể trong CSS
- 2. Thay thế tất cả các ocurrance của một chuỗi trong một phần tử
- 3. Tại sao CSS không đặt lại sử dụng '*' để bao gồm tất cả các phần tử?
- 4. CSS để di chuột bao gồm tất cả các phần tử con
- 5. chuyển tất cả các phần tử mảng lên một cấp trong một mảng đa chiều
- 6. Bao gồm tất cả các phụ thuộc
- 7. Nhận tất cả các phần tử, nhưng phần tử đầu tiên từ một mảng
- 8. Chọn tất cả các phần tử từ một cột trong một mảng các mảng trong Ruby?
- 9. phần tử mảng quấn tất cả các yếu tố
- 10. Thay đổi màu nền của tất cả các phần tử có cùng một lớp
- 11. Tổng hợp tất cả các phần tử mảng java
- 12. XPath để nhận tất cả các phần tử con ngoại trừ một phần tử có tên cụ thể?
- 13. Thay đổi kiểu của tất cả các phần tử khác khi một phần tử bị lơ lửng
- 14. Thay thế tất cả các phần tử trong Knockout.js observableArray
- 15. Cách xóa các phần tử cụ thể trong một mảng có nhiều mảng
- 16. Chọn tất cả các phần tử có CSS cụ thể, sử dụng jQuery
- 17. Thay đổi lớp css cho tất cả các phần tử với lớp đã nói với Javascript
- 18. Làm thế nào để chèn một phần tử mới vào giữa tất cả các phần tử của một mảng Ruby?
- 19. cx-freeze không bao gồm mô-đun ngay cả khi được bao gồm cụ thể
- 20. Cách kiểm tra TẤT CẢ các phần tử của một mảng boolean là đúng
- 21. Trả về tất cả các giá trị bao gồm NULL
- 22. Jquery: Ẩn tất cả trẻ em, sau đó hiển thị một phần tử cụ thể
- 23. Thay đổi kích thước phông chữ của tất cả các phần tử bên trong div
- 24. Cách chọn tất cả các phần tử có ID cụ thể trong jQuery?
- 25. tìm tất cả chuỗi trong một mảng
- 26. cách xóa tất cả các cá thể của một ký tự cụ thể khỏi một chuỗi
- 27. Làm thế nào để chuyển đổi tất cả các phần tử trong một mảng thành số nguyên trong JavaScript?
- 28. Android.mk, bao gồm tất cả các tệp cpp
- 29. Mercurial - Xem tất cả các thay đổi sửa đổi dòng cụ thể trong tập tin
- 30. Cách thay thế các phần tử trong mảng bằng các phần tử của mảng khác
Điều này không giải quyết được vấn đề đặt thành phần mảng thành giá trị khác. – cvshepherd
@maprihoda Lưu ý rằng trong khi 'grep' _is_ thuận tiện, không có gì ngăn cản bạn sử dụng regex với' select' hoặc 'find' (như trong câu trả lời của tôi). Thật vậy, bạn có thể thực hiện ** nhiều hơn nữa ** với các phương pháp chặn, ví dụ: 'select {| s | s = ~/good/i && s.length> 3} '. – Phrogz
@Phrogz nhiều hơn về mặt biểu thức chính quy; Tuy nhiên, bạn nói đúng, bạn có thể làm rất nhiều với lựa chọn, ví dụ chọn thứ hai trong bình luận của bạn minh họa nó rất độc đáo – maprihoda