arrays - 使用 .flatten 后,相同的字符串不相等
问题描述
晚上好。我有一个嵌套的名称数组。调用特定索引并使用==
返回 true。在 using 之后.flatten
,==
对相同的值使用会返回 false。
name_array
=> [["Theo", "Peter Jr.", "Lucky"], ["Theo", "Peter Jr.", "Ms. K"], ["Queenie", "Andrew", "Ms. K", "Alex"], ["Queenie", "Alex"]]
irb(main):044:0> name_array[0][0]
=> "Theo"
irb(main):045:0> name_array[1][0]
=> "Theo"
irb(main):046:0> name_array[0][0] == name_array[1][0]
=> true
irb(main):047:0> name_array.flatten
=> ["Theo", "Peter Jr.", "Lucky", "Theo", "Peter Jr.", "Ms. K", "Queenie", "Andrew", "Ms. K", "Alex", "Queenie", "Alex"]
irb(main):048:0> name_array[0] == name_array[3]
=> false
这里的最终目标是返回一个唯一名称的数组。我的第一直觉是使用.uniq
,但最终返回了原始的嵌套数组。应该注意的是,我首先通过将嵌套哈希转换为数组然后将数组值添加到 name_array 来获得这个嵌套数组。
irb(main):051:0> name_array.flatten
=> ["Theo", "Peter Jr.", "Lucky", "Theo", "Peter Jr.", "Ms. K", "Queenie", "Andrew", "Ms. K", "Alex", "Queenie", "Alex"]
irb(main):052:0> name_array.uniq
=> [["Theo", "Peter Jr.", "Lucky"], ["Theo", "Peter Jr.", "Ms. K"], ["Queenie", "Andrew", "Ms. K", "Alex"], ["Queenie", "Alex"]]
解决方案
这里的主要问题是#flatten
返回一个新数组而不改变原来的数组。
要解决它,您有两种方法:
- 定义一个带有数组的新变量,该数组在调用后返回
#flatten
flatten_array = name_array.flatten
flatten_array[0] == flatten_array[3]
=> true
- 使用
#flatten!
, 改变原始数组:
name_array.flatte!
name_array[0] == name_array[3]
摘要:解决您需要的问题:
name_array.flatten!
name_array.uniq # or .uniq!
# OR
flatten_array = name_array.flatten
flatten_array.uniq # or .uniq!
name_array.inject(&:|) # will do the same as name_array.flatten.uniq
PS这是你的第二个问题,同样的问题,我认为这可能有助于你理解它是如何工作的“:) 一般来说:带有感叹号的方法(!)会改变你的原始变量值,没有感叹号的方法(! ) 将返回一个新值
推荐阅读
- vb.net - VB.Net 中的 UNC 空间
- asp.net-core - .NET Core:参数列表中的 Edm.Date 使用会生成错误的 Swagger 文档
- ajax - 无法通过 Ajax 提交表单
- typescript - 如何使用字符串映射到打字稿中的对象键?
- python - 在 python 中写入二进制数据(标头失败)
- swift - 使用 TextField 的 ForEach onDelete 错误
- python - AttributeError:模块“tensorflow”没有属性“string_join”
- r - R 等价于 `table ,contents( )` 用于汇总统计的 Stata 命令
- javascript - 如何处理地图项中多个选择元素的 onchange 事件
- google-cloud-platform - 无法关闭统一存储桶级别