我有两个数组,我需要互相检查。当找到匹配时,我需要从第一个数组中取消值,并将该值推送到一个新数组。
下面是一个示例:
第一阵列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"]
请注意,"samus“显示在两个数组中,所有数据都相同,但颜色发生了更改。
我的意图是循环遍历import_data
,检查数组中每个项的最后一个索引(8位数字的"id"),并将其与current_data
进行比较。每次找到“匹配”(基于8位数字的"id")时,我都希望将该项推入一个新的数组update_data
中,然后在import_data
数组中进行匹配的unset
。
问题是两个数组的长度不同。因此,一旦我的循环超过一项的长度,它就不能再检查该索引,从而导致错误。
我的代码本质上是这样的:
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
阵列一个又一个循环
["mario", "blue", "SGC", "CJ672PA0"],
["solid snake", "green", "NID", "VI6965KD"],
---
["deckard cain", "purple", "JAFA", "SJW252MZ"],
["wedge", "yellow", "WALTER", "UJ28NVM1"]
新填充数组update_data
["samus", "maroon", "TRUST", "DNYU6539"]
发布于 2015-03-23 18:32:00
由于普拉卡什的答案是可行的,我认为这是比较直接的:
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
跑完之后你会得到:
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"]
]
希望能帮上忙。
发布于 2015-03-23 15:38:08
完成你正在做的事情的一种方法:
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"]
]
查找这两个数组的键:
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"]
通过将这两个数组相交来查找公共密钥:
common_keys = import_data_keys & current_data_keys
=> ["DNYU6539"]
使用common_keys
从import_data
中删除并推送到update_data
。
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
语句用于在元素找到和处理后停止该迭代。
https://stackoverflow.com/questions/29221948
复制相似问题