【问题标题】:Ruby remove empty, nil arrays strings from array of stringsRuby 从字符串数组中删除空的 nil 数组字符串
【发布时间】:2018-04-12 19:56:16
【问题描述】:

我有这个数组:

["[]", "[\"https://somewebsite1.com\"]", "[\"https://somewebsite2.com\"]", "[]", "[]", "[]", "---\n- https://somewebsite3.com\n", "--- []\n", "---\n- https://somewebsite4.com\n", "--- []\n", "--- []\n", "---\n- https://somewebsite.com\n", "---\n- https://somewebsite5.com\n", nil, nil, nil, nil, nil]      

我该怎么做:
1- 删除所有空的 nil 元素
2-有一个字符串数组:

["https://somewebsite1.com", "https://somewebsite2.com", "https://somewebsite3.com", "https://somewebsite4.com", "https://somewebsite.com", "https://somewebsite5.com"]

array.select &:present?删除nil
然后array.delete_if {|i| i == '[]'} 删除[]
所以我只剩下:

["[\"https://somewebsite1.com\"]", "[\"https://somewebsite2.com\"]",  "---\n- https://somewebsite3.com\n", "--- []\n", "---\n- https://somewebsite4.com\n", "--- []\n", "--- []\n", "---\n- https://somewebsite.com\n", "---\n- https://somewebsite5.com\n"]

【问题讨论】:

  • 不,那不是数组数组。那是字符串数组,其中字符串包含看似 yaml 代码的内容
  • YAML 和 JSON 的奇怪组合?还是 [] 是有效的 YAML,没有前导 ---
  • @meagar:是的,it appears to be valid yaml

标签: arrays ruby ruby-on-rails-3


【解决方案1】:

首先,它是一个简单的字符串数组。

您可以使用 array.compactarray.reject(&:nil?) 删除 nil 元素

要删除空的 yaml 条目,您可以使用反序列化

array.compact .reject { |i| YAML.parse(i).children.first.children.empty? } .map { |i| i.gsub('["', '').gsub('"]', '').gsub("---\n- ", '').strip }

所以输出就是你所说的。

更新:

另一种方法,无需字符串操作

res = a.compact
deserialized = res.map { |i| YAML.parse(i) }
res = deserialized.reject { |i| i.children.first.children.empty? }
res.map { |i| i.children.first.children.first.value }

【讨论】:

  • 很多 gsub,所以字符串操作,哇。 :) 为什么不使用YAML.parse 的输出呢?或者,更好的是YAML.load
  • 这是一个快速而肮脏的解决方案。是的,使用反序列化的 YAML 会好得多。
  • 只需使用YAML.load,它会大大简化代码my_array.compact.map(&YAML.method(:load)).reject(&:empty?).flatten
【解决方案2】:

要删除 nil 元素,您可以对数组使用 compact 方法。 要同时删除 nil 和空字符串,可以使用 select 方法:

my_array.select! { |element| element&.size.to_i > 0 }

要处理剩余的字符串,您需要遍历每个字符串并确定它是否需要 YAML 解析。您将用于收集该迭代结果的方法是map

my_array.map! { |element| clever_string_parsing_on(element) }

【讨论】:

  • 你尝试过你的第一个sn-p吗?它不工作。
  • 我的错——我试过了,但测试用例太简单了;该错误没有出现。我已经在修复中进行了编辑。很好的收获,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-21
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
  • 1970-01-01
相关资源
最近更新 更多