我有一個物件陣列,每個物件都有一個起點和終點。每個起點或終點都有一個名稱和一個點。我想根據名稱回傳唯一的起點-終點對。例如,在下面的陣列中:
[
obj1,
obj2,
obj3,
obj4
]
在哪里
obj1 = (o1=(name: "name 1", point: "x1, y1"), d1=(name: "name 3", point: "x2, y2"))
obj2 = (o2=(name: "name 2", point: "x3, y3"), d2=(name: "name 4", point: "x4, y4"))
obj3 = (o3=(name: "name 1", point: "x5, y5"), d3=(name: "name 3", point: "x6, y6"))
obj4 = (o4=(name: "name 2", point: "x7, y7"), d4=(name: "name 4", point: "x8, y8"))
obj1 被認為與 obj3 相同,因為 obj1.o1.name = obj3.o3.name 和 obj1.d1.name = obj3.d3.name。同樣,obj2 和 obj4 也是一樣的。如何從上面的陣列中只回傳 obj1(或 obj2)和 obj3(或 obj4)?
下面的代碼查看整個起點或終點以考慮唯一性,但我只需要考慮起點和終點的名稱。
my_array.map { |obj| [obj.origin, obj.destination] }
.uniq
uj5u.com熱心網友回復:
我認為最好通過先獲取唯一物件然后映射以獲取要點來反轉操作。
Array#uniq占用一個塊
arr
.uniq { |obj| obj.name }
.map { |obj| [obj.origin, obj.destination] }
您還可以使用 uniq 的簡寫.uniq(&:name)
uj5u.com熱心網友回復:
您可以使用uniq來獲取 uniq 物件。您還可以將塊傳遞給 uniq 以根據您的自定義過濾器獲取不同的元素。
檔案鏈接 - Array#uniq
所以像這樣的東西 -
# Objects initialization
obj1 = { origin: { name: "name 1", point: "x1, y1" }, destination: { name: "name 3", point: "x2, y2"} }
obj2 = { origin: { name: "name 2", point: "x3, y3" }, destination: { name: "name 4", point: "x4, y4" }}
obj3 = { origin: { name: "name 1", point: "x5, y5" }, destination: { name: "name 3", point: "x6, y6"} }
obj4 = { origin: { name: "name 2", point: "x7, y7" }, destination: { name: "name 4", point: "x8, y8" }}
my_array = [obj1, obj2, obj3, obj4]
# Now to get distinct by just origin name
my_array.uniq { |obj| obj[:origin][:name] }
#=> [obj1, obj2]
# To get distinct by origin name and destination name
# You can create an array of both names in uniq block
my_array.uniq { |obj| [obj[:origin][:name], obj[:destination][:name]] }
# => [obj1, obj2]
uj5u.com熱心網友回復:
uniq可以擋住
my_array.uniq { |obj| [obj.origin.name, obj.destination.name]}
.map { |obj| [obj.origin, obj.destination] }
# or
my_array.map { |obj| [obj.origin, obj.destination] }
.uniq { |pair| pair.map(&:name) }
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/454811.html
