Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- [
- {"name"=>"Red", "id"=>177, "shades"=>[{"shade"=>"light", "id"=>355}], "owner"=>false},
- {"name"=>"Red", "id"=>195, "shades"=>[{"shade"=>"dark", "id"=>135}],"owner"=>true},
- {"name"=>"Green", "id"=>192, "shades"=>[{"shade"=>"pale", "id"=>135}], "owner"=>true},
- {"name"=>"Blue", "id"=>191, "shades"=>[{"shade"=>"pale", "id"=>137}], "owner"=>true}
- ]
- [
- {"name"=>"Red", "id"=>195, "shades"=>[{"shade"=>"dark", "id"=>135}, {"shade"=>"light", "id"=>355}],"owner"=>true},
- {"name"=>"Green", "id"=>192, "shades"=>[{"shade"=>"pale", "id"=>135}], "owner"=>true},
- {"name"=>"Blue", "id"=>191, "shades"=>[{"shade"=>"light", "id"=>137}], "owner"=>true}
- ]
- ary = [
- {"name"=>"Red", "id"=>177, "shades"=>[{"shade"=>"light", "id"=>355}], "owner"=>false},
- {"name"=>"Red", "id"=>195, "shades"=>[{"shade"=>"dark", "id"=>135}],"owner"=>true},
- {"name"=>"Green", "id"=>192, "shades"=>[{"shade"=>"pale", "id"=>135}], "owner"=>true},
- {"name"=>"Blue", "id"=>191, "shades"=>[{"shade"=>"pale", "id"=>137}], "owner"=>true }
- ]
- ary.group_by { |h| h['name']}.values.map{ |ary|
- ary.sort_by{ |h| h['owner'] ? 1 : 0 }.inject { |merged, new|
- merged.merge(new) {|key, old, new| key == 'shades' ? old + new : new }
- }
- }
- [
- {"name"=>"Red", "id"=>195, "shades"=>[{"shade"=>"light", "id"=>355}, {"shade"=>"dark", "id"=>135}], "owner"=>true},
- {"name"=>"Green", "id"=>192, "shades"=>[{"shade"=>"pale", "id"=>135}], "owner"=>true},
- {"name"=>"Blue", "id"=>191, "shades"=>[{"shade"=>"pale", "id"=>137}], "owner"=>true}
- ]
- j = [
- {"name"=>"Red", "id"=>177, "shades"=>[{"shade"=>"light", "id"=>355}], "owner"=>false},
- {"name"=>"Red", "id"=>195, "shades"=>[{"shade"=>"dark", "id"=>135}],"owner"=>true},
- {"name"=>"Green", "id"=>192, "shades"=>[{"shade"=>"pale", "id"=>135}], "owner"=>true},
- {"name"=>"Blue", "id"=>191, "shades"=>[{"shade"=>"pale", "id"=>137}], "owner"=>true
- }
- ]
- j.each_with_object([]) do |hsh,arr|
- if arr.last && arr.last["name"] == hsh["name"] && arr.last["owner"]
- #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`
- arr.last["shades"] += hsh["shades"]
- elsif arr.last && arr.last["name"] == hsh["name"]
- #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
- arr.last["id"] = hsh["id"]
- arr.last["shades"] += hsh["shades"]
- arr.last["owner"] = hsh["owner"]
- else
- arr << hsh
- end
- end
- #=> [{"name"=>"Red", "id"=>195, "shades"=>[{"shade"=>"light", "id"=>355}, {"shade"=>"dark", "id"=>135}], "owner"=>true},
- {"name"=>"Green", "id"=>192, "shades"=>[{"shade"=>"pale", "id"=>135}], "owner"=>true},
- {"name"=>"Blue", "id"=>191, "shades"=>[{"shade"=>"pale", "id"=>137}], "owner"=>true}]
- owners, nonowners = ary.partition { |h| h["owner"] }
- h = owners.each_with_object({}) { |g,h| h[g["name"]] = g }
- nonowners.each { |g| h[g["name"]]["shades"] << (g["shades"].first) }
- h.values
- ary = [
- {"name"=>"Red", "id"=>177, "shades"=>[{"shade"=>"light", "id"=>355}],
- "owner"=>false},
- {"name"=>"Red", "id"=>195, "shades"=>[{"shade"=>"dark", "id"=>135}],
- "owner"=>true},
- {"name"=>"Green", "id"=>192, "shades"=>[{"shade"=>"pale", "id"=>135}],
- "owner"=>true},
- {"name"=>"Blue", "id"=>191, "shades"=>[{"shade"=>"pale", "id"=>137}],
- "owner"=>true}
- ]
- owners, nonowners = ary.partition { |h| h["owner"] }
- # owners=>
- # [{"name"=>"Red", "id"=>195,
- # "shades"=>[{"shade"=>"dark", "id"=>135}], "owner"=>true},
- # {"name"=>"Green", "id"=>192,
- # "shades"=>[{"shade"=>"pale", "id"=>135}], "owner"=>true},
- # {"name"=>"Blue", "id"=>191,
- # "shades"=>[{"shade"=>"pale", "id"=>137}], "owner"=>true}],
- # nonowners=>
- # [{"name"=>"Red", "id"=>177,
- # "shades"=>[{"shade"=>"light", "id"=>355}], "owner"=>false}]]
- h = owners.each_with_object({}) { |g,h| h[g["name"]] = g }
- #=> {"Red"=>{"name"=>"Red", "id"=>195,
- # "shades"=>[{"shade"=>"dark", "id"=>135}], "owner"=>true},
- # "Green"=>{"name"=>"Green", "id"=>192,
- # "shades"=>[{"shade"=>"pale", "id"=>135}], "owner"=>true},
- # "Blue"=>{"name"=>"Blue", "id"=>191,
- # "shades"=>[{"shade"=>"pale", "id"=>137}], "owner"=>true}}
- nonowners.each { |g| h[g["name"]]["shades"] << (g["shades"].first) }
- h #=> {"Red" =>{"name"=>"Red", "id"=>195,
- # "shades"=>[{"shade"=>"dark","id"=>135}, {"shade"=>"light","id"=>355}],
- # "owner"=>true},
- # "Green"=>{"name"=>"Green", "id"=>192,
- # "shades"=>[{"shade"=>"pale", "id"=>135}], "owner"=>true},
- # "Blue"=>{"name"=>"Blue", "id"=>191,
- # "shades"=>[{"shade"=>"pale", "id"=>137}], "owner"=>true}}
- h.values
- #=> [{"name"=>"Red", "id"=>195,
- # "shades"=>[{"shade"=>"dark","id"=>135}, {"shade"=>"light","id"=>355}],
- # "owner"=>true},
- # {"name"=>"Green", "id"=>192,
- # "shades"=>[{"shade"=>"pale", "id"=>135}], "owner"=>true},
- # {"name"=>"Blue", "id"=>191,
- # "shades"=>[{"shade"=>"pale", "id"=>137}], "owner"=>true}]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement