Advertisement
Guest User

Untitled

a guest
Apr 19th, 2014
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.50 KB | None | 0 0
  1. [
  2. {"name"=>"Red", "id"=>177, "shades"=>[{"shade"=>"light", "id"=>355}], "owner"=>false},
  3. {"name"=>"Red", "id"=>195, "shades"=>[{"shade"=>"dark", "id"=>135}],"owner"=>true},
  4. {"name"=>"Green", "id"=>192, "shades"=>[{"shade"=>"pale", "id"=>135}], "owner"=>true},
  5. {"name"=>"Blue", "id"=>191, "shades"=>[{"shade"=>"pale", "id"=>137}], "owner"=>true}
  6. ]
  7.  
  8. [
  9. {"name"=>"Red", "id"=>195, "shades"=>[{"shade"=>"dark", "id"=>135}, {"shade"=>"light", "id"=>355}],"owner"=>true},
  10. {"name"=>"Green", "id"=>192, "shades"=>[{"shade"=>"pale", "id"=>135}], "owner"=>true},
  11. {"name"=>"Blue", "id"=>191, "shades"=>[{"shade"=>"light", "id"=>137}], "owner"=>true}
  12. ]
  13.  
  14. ary = [
  15. {"name"=>"Red", "id"=>177, "shades"=>[{"shade"=>"light", "id"=>355}], "owner"=>false},
  16. {"name"=>"Red", "id"=>195, "shades"=>[{"shade"=>"dark", "id"=>135}],"owner"=>true},
  17. {"name"=>"Green", "id"=>192, "shades"=>[{"shade"=>"pale", "id"=>135}], "owner"=>true},
  18. {"name"=>"Blue", "id"=>191, "shades"=>[{"shade"=>"pale", "id"=>137}], "owner"=>true }
  19. ]
  20.  
  21. ary.group_by { |h| h['name']}.values.map{ |ary|
  22. ary.sort_by{ |h| h['owner'] ? 1 : 0 }.inject { |merged, new|
  23. merged.merge(new) {|key, old, new| key == 'shades' ? old + new : new }
  24. }
  25. }
  26.  
  27. [
  28. {"name"=>"Red", "id"=>195, "shades"=>[{"shade"=>"light", "id"=>355}, {"shade"=>"dark", "id"=>135}], "owner"=>true},
  29. {"name"=>"Green", "id"=>192, "shades"=>[{"shade"=>"pale", "id"=>135}], "owner"=>true},
  30. {"name"=>"Blue", "id"=>191, "shades"=>[{"shade"=>"pale", "id"=>137}], "owner"=>true}
  31. ]
  32.  
  33. j = [
  34. {"name"=>"Red", "id"=>177, "shades"=>[{"shade"=>"light", "id"=>355}], "owner"=>false},
  35. {"name"=>"Red", "id"=>195, "shades"=>[{"shade"=>"dark", "id"=>135}],"owner"=>true},
  36. {"name"=>"Green", "id"=>192, "shades"=>[{"shade"=>"pale", "id"=>135}], "owner"=>true},
  37. {"name"=>"Blue", "id"=>191, "shades"=>[{"shade"=>"pale", "id"=>137}], "owner"=>true
  38. }
  39. ]
  40.  
  41. j.each_with_object([]) do |hsh,arr|
  42. if arr.last && arr.last["name"] == hsh["name"] && arr.last["owner"]
  43. #This clause checks if the `arr.last` is non-nil (as `nil` in ruby is `falsy`) just to ensure that `arr` is not empty, if the lookup of `"name"` key of the current yielded hash is same as the name element of the last element stored in `arr`, and the lookup of `"owner"` key is `true` then concat the `"shades"` lookup from the current yielded element to that of the last element in `arr`
  44. arr.last["shades"] += hsh["shades"]
  45. elsif arr.last && arr.last["name"] == hsh["name"]
  46. #This clause is similar to the previous except it does not consider the `"owner"` key lookup, and it replaces the value `"id"`, `"owner"` of the last element in `arr` with that of the `hsh` while it still concats
  47. arr.last["id"] = hsh["id"]
  48. arr.last["shades"] += hsh["shades"]
  49. arr.last["owner"] = hsh["owner"]
  50. else
  51. arr << hsh
  52. end
  53. end
  54.  
  55. #=> [{"name"=>"Red", "id"=>195, "shades"=>[{"shade"=>"light", "id"=>355}, {"shade"=>"dark", "id"=>135}], "owner"=>true},
  56. {"name"=>"Green", "id"=>192, "shades"=>[{"shade"=>"pale", "id"=>135}], "owner"=>true},
  57. {"name"=>"Blue", "id"=>191, "shades"=>[{"shade"=>"pale", "id"=>137}], "owner"=>true}]
  58.  
  59. owners, nonowners = ary.partition { |h| h["owner"] }
  60. h = owners.each_with_object({}) { |g,h| h[g["name"]] = g }
  61. nonowners.each { |g| h[g["name"]]["shades"] << (g["shades"].first) }
  62. h.values
  63.  
  64. ary = [
  65. {"name"=>"Red", "id"=>177, "shades"=>[{"shade"=>"light", "id"=>355}],
  66. "owner"=>false},
  67. {"name"=>"Red", "id"=>195, "shades"=>[{"shade"=>"dark", "id"=>135}],
  68. "owner"=>true},
  69. {"name"=>"Green", "id"=>192, "shades"=>[{"shade"=>"pale", "id"=>135}],
  70. "owner"=>true},
  71. {"name"=>"Blue", "id"=>191, "shades"=>[{"shade"=>"pale", "id"=>137}],
  72. "owner"=>true}
  73. ]
  74.  
  75. owners, nonowners = ary.partition { |h| h["owner"] }
  76. # owners=>
  77. # [{"name"=>"Red", "id"=>195,
  78. # "shades"=>[{"shade"=>"dark", "id"=>135}], "owner"=>true},
  79. # {"name"=>"Green", "id"=>192,
  80. # "shades"=>[{"shade"=>"pale", "id"=>135}], "owner"=>true},
  81. # {"name"=>"Blue", "id"=>191,
  82. # "shades"=>[{"shade"=>"pale", "id"=>137}], "owner"=>true}],
  83. # nonowners=>
  84. # [{"name"=>"Red", "id"=>177,
  85. # "shades"=>[{"shade"=>"light", "id"=>355}], "owner"=>false}]]
  86.  
  87. h = owners.each_with_object({}) { |g,h| h[g["name"]] = g }
  88. #=> {"Red"=>{"name"=>"Red", "id"=>195,
  89. # "shades"=>[{"shade"=>"dark", "id"=>135}], "owner"=>true},
  90. # "Green"=>{"name"=>"Green", "id"=>192,
  91. # "shades"=>[{"shade"=>"pale", "id"=>135}], "owner"=>true},
  92. # "Blue"=>{"name"=>"Blue", "id"=>191,
  93. # "shades"=>[{"shade"=>"pale", "id"=>137}], "owner"=>true}}
  94.  
  95. nonowners.each { |g| h[g["name"]]["shades"] << (g["shades"].first) }
  96.  
  97. h #=> {"Red" =>{"name"=>"Red", "id"=>195,
  98. # "shades"=>[{"shade"=>"dark","id"=>135}, {"shade"=>"light","id"=>355}],
  99. # "owner"=>true},
  100. # "Green"=>{"name"=>"Green", "id"=>192,
  101. # "shades"=>[{"shade"=>"pale", "id"=>135}], "owner"=>true},
  102. # "Blue"=>{"name"=>"Blue", "id"=>191,
  103. # "shades"=>[{"shade"=>"pale", "id"=>137}], "owner"=>true}}
  104.  
  105. h.values
  106. #=> [{"name"=>"Red", "id"=>195,
  107. # "shades"=>[{"shade"=>"dark","id"=>135}, {"shade"=>"light","id"=>355}],
  108. # "owner"=>true},
  109. # {"name"=>"Green", "id"=>192,
  110. # "shades"=>[{"shade"=>"pale", "id"=>135}], "owner"=>true},
  111. # {"name"=>"Blue", "id"=>191,
  112. # "shades"=>[{"shade"=>"pale", "id"=>137}], "owner"=>true}]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement