0

I have a json with a main key called section and nested objects of each product within products array.

My json:

{
  "data": [
      {
          "section": 0,
          "products": [
              {
                  "product": "Name 1",
                  "rate": 79.96
              },
              {
                  "product": "Name 2",
                  "rate": 45.96
              }
          ]
      },
      {
          "section": 1,
          "products": [
              {
                  "product": "Name 1",
                  "rate": 86.06
              },
              {
                  "product": "Name 2",
                  "rate": 98.96
              }
          ]
      },
      {
          "section": 2,
          "products": [
              {
                  "product": "Name 1",
                  "rate": 78.95
              },
              {
                  "product": "Name 2",
                  "rate": 24.96
              }
          ]
      },
      {
          "section": 3,
          "products": [
              {
                  "product": "Name 1",
                  "rate": 76.11
              },
              {
                  "product": "Name 2",
                  "rate": 74.96
              }
          ]
      },
      {
          "section": 4,
          "products": [
              {
                  "product": "Name 1",
                  "rate": 76.07
              },
              {
                  "product": "Name 2",
                  "rate": 58.96
              }
          ]
      },
      {
          "section": 5,
          "products": [
              {
                  "product": "Name 1",
                  "rate": 81.15
              },
              {
                  "product": "Name 2",
                  "rate": 15.96
              }
          ]
      }
  ]
}

How am I able to search within the products in all the sections and find the lowest rate for a product with the uniqueness of each product name within the whole data and push to its own object or array?

result example:

{
  "data": [
    {
      "product": "Name 1",
      "rate": 76.07,
      "section": 4
    },
    {
        "product": "Name 2",
        "rate": 15.96,
        "section": 5
    }
  ]
}

I would of course show what I've done so far, but I'm not sure even where and how to start.

Thank you in advance!

1 Answer 1

1

The best thing to do is break this down into smaller problems. You can reaily use #each_with_object to build a flat array of "products" and add a :section key to each product info hash.

json[:data].each_with_object([]) { |h, arr|
  h[:products].each { |prod|
    arr << { :section => h[:section], **prod }
  }
}

These can be grouped by product name.

json[:data].each_with_object([]) { |h, arr|
  h[:products].each { |prod|
    arr << { :section => h[:section], **prod }
  }
}.group_by { |h| 
  h[:product] 
}

Now we have a hash containing arrays. We really only need the values.

json[:data].each_with_object([]) { |h, arr|
  h[:products].each { |prod|
    arr << { :section => h[:section], **prod }
  }
}.group_by { |h| 
  h[:product] 
}.values

And for each of these, we need the minimum element by the :rate value.

json[:data].each_with_object([]) { |h, arr|
  h[:products].each { |prod|
    arr << { :section => h[:section], **prod }
  }
}.group_by { |h| 
  h[:product] 
}.values.map { |arr|
  arr.min_by { |prod| prod[:rate] }
}

The result:

[{:section=>4, :product=>"Name 1", :rate=>76.07}, 
 {:section=>5, :product=>"Name 2", :rate=>15.96}]
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.