Ruby on rails ruby数组中特定索引处的push元素
我有一个从db返回的数组,希望确保它们的长度始终相同。当它们不是时,我想推零,使它们成为适当的长度,但也保持索引的完整性 大多数时候它看起来像Ruby on rails ruby数组中特定索引处的push元素,ruby-on-rails,ruby,arrays,Ruby On Rails,Ruby,Arrays,我有一个从db返回的数组,希望确保它们的长度始终相同。当它们不是时,我想推零,使它们成为适当的长度,但也保持索引的完整性 大多数时候它看起来像 array = [["apple", "blueberries", "banana", "kiwi"], ["20.15", "13.50", "22.10", "10.50"], ["10", "12", "26", "34"]] 我最终会调用每个带有索引的\u,并需要它们在一个表中匹配苹果,20.15,10 每隔一段时间,一个数组中可能会缺少一两个
array = [["apple", "blueberries", "banana", "kiwi"], ["20.15", "13.50", "22.10", "10.50"], ["10", "12", "26", "34"]]
我最终会调用每个带有索引的\u
,并需要它们在一个表中匹配苹果,20.15,10
每隔一段时间,一个数组中可能会缺少一两个元素,我想把零放在它们的位置上
array2 = [["apple", "blueberries", "banana", "kiwi"], ["20.15", "22.10"], ["10", "12", "26", "34"]]
我试过类似的方法
array2.each {|f| f.push(0) until f.length === 4}
=>[["apple", "blueberries", "banana", "kiwi"], ["20.15", "13.50", 0, 0], ["10", "12", "26", "34"]]
但是零将被推到数组的末尾-理想情况下输出是
=>[["apple", "blueberries", "banana", "kiwi"], ["20.15", 0, "13.50", 0], ["10", "12", "26", "34"]]
在此作出一些假设:
array2
的大小始终为4array2
将只缺少1或2个元素我不想告诉你们,但编程对孩子们来说并不是一件容易的事情,正如非程序员的成年人有时想象的那样。您的案例需要创建一个单独的类,可能是数组的子类。像这样:
class GreenGrocer < Array
end
但是为什么要麻烦呢?创建一个#to_table
方法,将不完整的数据结构转换为需要的表,并在过程中用零填充缺失的数据点,就足够了。因此,我们定义:
class LazierGreenGrocer < Array
def to_table
reduce( &:zip ).map( &:flatten ).map { |e| e.map { |e| e || 0 } }
end
end
lazier_g = LazierGreenGrocer.new( array2 ) # not eager to do work upon initialization
lazier_g.to_table # does the required work as #to_table is called
class-LazierGreenGrocer
我会这样做的。由于我不知道您希望输出哪种类型的表,您可能需要相应地修改我的
#to_table
方法。您应该提供更多信息。有什么标准吗?(类型、期望值列表等)——正如您所描述的,没有(明确的)方法来理解缺少了什么。i、 e.如果一个数组有3项而不是4项,是否有办法确定缺少哪一项?看起来不一致。是否确实要在其他元素为字符串的位置推送数字零?此外,第一个数组中的字符串是否属于某种类型的头?如果是,第一个数组(头)是否有丢失的项?如果它来自DB,您还应该说明您正在使用的gem(DB适配器)。很可能有一种方法可以获得散列
,而不是数组的数组
。我试图将其分解为我认为最基本的问题版本,但看起来我做得太过分了,没有提供足够的信息@tompave,在您的场景中,我不需要知道哪一个没有4-任何数组都可能缺少项,它们不是头。我很欣赏这种见解,我认为散列是一种方法。使用了#to_table
方法,效果非常好。谢谢考虑到你对问题的描述,我仍然认为这个解决方案行不通。它会在找到它们时填补空白,就像原始的-不起作用-解决方案一样。@topmave,确切的行为并不重要。编写任何一种行为的程序都很容易。重要的是,本案例羡慕OO解决方案。
class GreenGrocer # reopening the class we defined earlier
class << self
def new array
produce, float_array, int_array = array.reduce( &:zip ).map( &:flatten ).transpose
super [ produce, float_array.map { |e| e or 0.0 }, int_array.map { |e| e or 0 } ]
end
def [] *elements; new elements end
end
end
# so we can call
g = GreenGrocer.new( array2 )
# or
g = GreenGrocer[ *array2 ]
class LazierGreenGrocer < Array
def to_table
reduce( &:zip ).map( &:flatten ).map { |e| e.map { |e| e || 0 } }
end
end
lazier_g = LazierGreenGrocer.new( array2 ) # not eager to do work upon initialization
lazier_g.to_table # does the required work as #to_table is called