首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Rails:循环比较两个数组并将匹配推送到新数组

Rails:循环比较两个数组并将匹配推送到新数组
EN

Stack Overflow用户
提问于 2015-03-23 22:54:42
回答 2查看 1.3K关注 0票数 1

我有两个数组,我需要互相检查。当找到匹配时,我需要从第一个数组中取消值,并将该值推送到一个新数组。

下面是一个示例:

第一阵列import_data

代码语言:javascript
代码运行次数:0
运行
复制
["mario", "blue", "SGC", "CJ672PA0"], 
["solid snake", "green", "NID", "VI6965KD"], 
["samus", "maroon", "TRUST", "DNYU6539"], 
["deckard cain", "purple", "JAFA", "SJW252MZ"],
["wedge", "yellow", "WALTER", "UJ28NVM1"]

第二阵列current_data

代码语言:javascript
代码运行次数:0
运行
复制
["gordon", "orange", "DRONE", "OGJR8C0D"], 
["samus", "black", "TRUST", "DNYU6539"], 
["commander shepard", "red", "WHX", "TH985OI3"]

请注意,"samus“显示在两个数组中,所有数据都相同,但颜色发生了更改。

我的意图是循环遍历import_data,检查数组中每个项的最后一个索引(8位数字的"id"),并将其与current_data进行比较。每次找到“匹配”(基于8位数字的"id")时,我都希望将该项推入一个新的数组update_data中,然后在import_data数组中进行匹配的unset

问题是两个数组的长度不同。因此,一旦我的循环超过一项的长度,它就不能再检查该索引,从而导致错误。

我的代码本质上是这样的:

代码语言:javascript
代码运行次数:0
运行
复制
import_data.each_with_index do |data, index|
  if data[3] == current_data[index].id
    # @update_data << somehow push all of the data
  end
end

之所以不能工作,是因为import_data的长度比current_data的长。这将导致错误:

“未定义的方法‘`id’for nil:NilClass"

理想情况下,最终结果如下:

"samus“已从import_data数组中移除并推送到update_data数组中。

import_data阵列一个又一个循环

代码语言:javascript
代码运行次数:0
运行
复制
["mario", "blue", "SGC", "CJ672PA0"], 
["solid snake", "green", "NID", "VI6965KD"], 
--- 
["deckard cain", "purple", "JAFA", "SJW252MZ"],
["wedge", "yellow", "WALTER", "UJ28NVM1"]

新填充数组update_data

代码语言:javascript
代码运行次数:0
运行
复制
 ["samus", "maroon", "TRUST", "DNYU6539"]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-24 02:32:00

由于普拉卡什的答案是可行的,我认为这是比较直接的:

代码语言:javascript
代码运行次数:0
运行
复制
import_data = [
  ["mario", "blue", "SGC", "CJ672PA0"], 
  ["solid snake", "green", "NID", "VI6965KD"], 
  ["samus", "maroon", "TRUST", "DNYU6539"], 
  ["deckard cain", "purple", "JAFA", "SJW252MZ"],
  ["wedge", "yellow", "WALTER", "UJ28NVM1"]
]
current_data = [
  ["gordon", "orange", "DRONE", "OGJR8C0D"], 
  ["samus", "black", "TRUST", "DNYU6539"], 
  ["commander shepard", "red", "WHX", "TH985OI3"]
]

current_ids = current_data.map {|c| c[3]}

update_data = import_data.inject([]) do |result, data|
  result << import_data.delete(data) if current_ids.include?(data[3])
  result
end

跑完之后你会得到:

代码语言:javascript
代码运行次数:0
运行
复制
update_data = [
  ["samus", "maroon", "TRUST", "DNYU6539"]
]
import_data = [
  ["mario", "blue", "SGC", "CJ672PA0"], 
  ["solid snake", "green", "NID", "VI6965KD"], 
  ["deckard cain", "purple", "JAFA", "SJW252MZ"],
  ["wedge", "yellow", "WALTER", "UJ28NVM1"]
]

希望能帮上忙。

票数 3
EN

Stack Overflow用户

发布于 2015-03-23 23:38:08

完成你正在做的事情的一种方法:

代码语言:javascript
代码运行次数:0
运行
复制
import_data = [ 
                ["mario", "blue", "SGC", "CJ672PA0"], 
                ["solid snake", "green", "NID", "VI6965KD"], 
                ["samus", "maroon", "TRUST", "DNYU6539"], 
                ["deckard cain", "purple", "JAFA", "SJW252MZ"],
                ["wedge", "yellow", "WALTER", "UJ28NVM1"]
              ]

current_data = [
                 ["gordon", "orange", "DRONE", "OGJR8C0D"], 
                 ["samus", "black", "TRUST", "DNYU6539"], 
                 ["commander shepard", "red", "WHX", "TH985OI3"]
                ]

查找这两个数组的键:

代码语言:javascript
代码运行次数:0
运行
复制
import_data_keys = import_data.map { |x| x[3] }
=> ["CJ672PA0", "VI6965KD", "DNYU6539", "SJW252MZ", "UJ28NVM1"]
current_data_keys = current_data.map { |x| x[3] }
=> ["OGJR8C0D", "DNYU6539", "TH985OI3"]

通过将这两个数组相交来查找公共密钥:

代码语言:javascript
代码运行次数:0
运行
复制
common_keys = import_data_keys & current_data_keys
=> ["DNYU6539"]

使用common_keysimport_data中删除并推送到update_data

代码语言:javascript
代码运行次数:0
运行
复制
common_keys.each do |key|
  import_data.each_with_index do |data, index|
    if data[3] == key
      update_data << import_data[index]
      import_data.delete_at(index)
      break
    end
  end
end

注意:break语句用于在元素找到和处理后停止该迭代。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29221948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档