首页 > 解决方案 > 使用 .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"]]

标签: arraysrubymultidimensional-array

解决方案


这里的主要问题是#flatten返回一个新数组而不改变原来的数组。

要解决它,您有两种方法:

  1. 定义一个带有数组的新变量,该数组在调用后返回#flatten
flatten_array = name_array.flatten

flatten_array[0] == flatten_array[3]
=> true
  1. 使用#flatten!, 改变原始数组:
name_array.flatte!

name_array[0] == name_array[3]

与 , 相同#uniq,改变原来的用途:#uniq!

摘要:解决您需要的问题:

name_array.flatten!
name_array.uniq # or .uniq!

# OR

flatten_array = name_array.flatten
flatten_array.uniq # or .uniq!

还有一个技巧,使用:#inject#|

name_array.inject(&:|) # will do the same as name_array.flatten.uniq

PS这是你的第二个问题,同样的问题,我认为可能有助于你理解它是如何工作的“:) 一般来说:带有感叹号的方法(!)会改变你的原始变量值,没有感叹号的方法(! ) 将返回一个新值


推荐阅读