1

Given Object

The array of objects is given to us as follows, we have to convert it to the expected array of objects.


    [
        {
          "tm_number": "9724084103",
          "tm_name": "PRADIP BHAI",
          "zsm_number": "9974252013",
          "zsm_name": "Jay Ambe1 Communicati",
          "zbm_number": "1234567890",
          "zbm_name": "ARIF MALEK",
          "ceo/sales_head/marketing_head_number": "9898049452",
          "zone_name": "Surat",
          "circle_name": "Gujarat",
          "category": "Challenger"
        },
        {
          "tm_number": "9724084103",
          "tm_name": "PRADIP duplicate",
          "zsm_number": "9974252013",
          "zsm_name": "Jay Ambe1 Communicati",
          "zbm_number": "1234567890",
          "zbm_name": "ARIF MALEK",
          "ceo/sales_head/marketing_head_number": "9898049452",
          "zone_name": "Surat",
          "circle_name": "Gujarat",
          "category": "Challenger"
        },
        {
          "tm_number": "9724084105",
          "tm_name": "PRADIP BHAI",
          "zsm_number": "9974252013",
          "zsm_name": "Jay Ambe Communicati",
          "zbm_number": "1234567890",
          "zbm_name": "ARIF MALEK",
          "ceo/sales_head/marketing_head_number": "9898049452",
          "zone_name": "Surat",
          "circle_name": "Gujarat",
          "category": "Challenger"
        },
        {
          "tm_number": "972484103",
          "tm_name": "SK BHAI",
          "zsm_number": "9974252013",
          "zsm_name": "Jay Ambe 2 Communicati",
          "zbm_number": "1234567890",
          "zbm_name": "ARIF MALEK",
          "ceo/sales_head/marketing_head_number": "9898049452",
          "zone_name": "Surat",
          "circle_name": "Gujarat",
          "category": "Challenger"
        },
        {
          "tm_number": "972484103",
          "tm_name": "SK BHAI",
          "zsm_number": "9974252013",
          "zsm_name": "Jay Ambe 3 Communicati",
          "zbm_number": "1234567890",
          "zbm_name": "ARIF MALEK",
          "ceo/sales_head/marketing_head_number": "9898049452",
          "zone_name": "Surat",
          "circle_name": "Gujarat",
          "category": "Challenger"
        }
    ]

Expected Object Output


    [
      {
        "9724084103": [
          {
            "tm_name": "PRADIP BHAI",
            "zsm_number": "9974252013",
            "zsm_name": "Jay Ambe1 Communicati",
            "zbm_number": "1234567890",
            "zbm_name": "ARIF MALEK",
            "ceo/sales_head/marketing_head_number": "9898049452",
            "zone_name": "Surat",
            "circle_name": "Gujarat",
            "category": "Challenger"
          },
          {
            "tm_name": "PRADIP duplicate",
            "zsm_number": "9974252013",
            "zsm_name": "Jay Ambe1 Communicati",
            "zbm_number": "1234567890",
            "zbm_name": "ARIF MALEK",
            "ceo/sales_head/marketing_head_number": "9898049452",
            "zone_name": "Surat",
            "circle_name": "Gujarat",
            "category": "Challenger"
          }
        ]
      },
      {
        "9724084105": [
          {
            "tm_number": "9724084105",
            "tm_name": "PRADIP BHAI",
            "zsm_number": "9974252013",
            "zsm_name": "Jay Ambe Communicati",
            "zbm_number": "1234567890",
            "zbm_name": "ARIF MALEK",
            "ceo/sales_head/marketing_head_number": "9898049452",
            "zone_name": "Surat",
            "circle_name": "Gujarat",
            "category": "Challenger"
          }
        ]
      },
      {
        "972484103": [
          {
            "tm_name": "SK BHAI",
            "zsm_number": "9974252013",
            "zsm_name": "Jay Ambe 2 Communicati",
            "zbm_number": "1234567890",
            "zbm_name": "ARIF MALEK",
            "ceo/sales_head/marketing_head_number": "9898049452",
            "zone_name": "Surat",
            "circle_name": "Gujarat",
            "category": "Challenger"
          },
          {
            "tm_name": "SK BHAI",
            "zsm_number": "9974252013",
            "zsm_name": "Jay Ambe 3 Communicati",
            "zbm_number": "1234567890",
            "zbm_name": "ARIF MALEK",
            "ceo/sales_head/marketing_head_number": "9898049452",
            "zone_name": "Surat",
            "circle_name": "Gujarat",
            "category": "Challenger"
          }
        ]
      }
    ]

NOTE:

keys will be dynamic so manage your program accordingly

Below is the approach I used, but not getting the expected output as above. Could you please efficient way of doing this?

const data = [
{
    tm_number: "9724084103",
    tm_name: "PRADIP BHAI",
    zsm_number: "9974252013",
    zsm_name: "Jay Ambe1 Communicati",
    zbm_number: "1234567890",
    zbm_name: "ARIF MALEK",
    "ceo/sales_head/marketing_head_number": "9898049452",
    zone_name: "Surat",
    circle_name: "Gujarat",
    category: "Challenger",
  },
  {
    tm_number: "9724084103",
    tm_name: "PRADIP duplicate",
    zsm_number: "9974252013",
    zsm_name: "Jay Ambe1 Communicati",
    zbm_number: "1234567890",
    zbm_name: "ARIF MALEK",
    "ceo/sales_head/marketing_head_number": "9898049452",
    zone_name: "Surat",
    circle_name: "Gujarat",
    category: "Challenger",
  },
  {
    tm_number: "9724084105",
    tm_name: "PRADIP BHAI",
    zsm_number: "9974252013",
    zsm_name: "Jay Ambe Communicati",
    zbm_number: "1234567890",
    zbm_name: "ARIF MALEK",
    "ceo/sales_head/marketing_head_number": "9898049452",
    zone_name: "Surat",
    circle_name: "Gujarat",
    category: "Challenger",
  },
  {
    tm_number: "972484103",
    tm_name: "SK BHAI",
    zsm_number: "9974252013",
    zsm_name: "Jay Ambe 2 Communicati",
    zbm_number: "1234567890",
    zbm_name: "ARIF MALEK",
    "ceo/sales_head/marketing_head_number": "9898049452",
    zone_name: "Surat",
    circle_name: "Gujarat",
    category: "Challenger",
  },
  {
    tm_number: "972484103",
    tm_name: "SK BHAI",
    zsm_number: "9974252013",
    zsm_name: "Jay Ambe 3 Communicati",
    zbm_number: "1234567890",
    zbm_name: "ARIF MALEK",
    "ceo/sales_head/marketing_head_number": "9898049452",
    zone_name: "Surat",
    circle_name: "Gujarat",
    category: "Challenger",
  },
];

function groupId(data) {
  let obj = {};
  const mydata = data.map((item) => {
    if (obj[item.tm_number]) {
      obj[item.tm_number].push(item);
    } else {
      obj[item.tm_number] = [item];
    }

    return obj;
  });

  console.log(mydata);
}

groupId(data);

2 Answers 2

3

You should use reduce, not map, which is returning multiple copies of obj into your result. Then you can split the result object into an array of objects using map:

const data = [{
    tm_number: "9724084103",
    tm_name: "PRADIP BHAI",
    zsm_number: "9974252013",
    zsm_name: "Jay Ambe1 Communicati",
    zbm_number: "1234567890",
    zbm_name: "ARIF MALEK",
    "ceo/sales_head/marketing_head_number": "9898049452",
    zone_name: "Surat",
    circle_name: "Gujarat",
    category: "Challenger",
  },
  {
    tm_number: "9724084103",
    tm_name: "PRADIP duplicate",
    zsm_number: "9974252013",
    zsm_name: "Jay Ambe1 Communicati",
    zbm_number: "1234567890",
    zbm_name: "ARIF MALEK",
    "ceo/sales_head/marketing_head_number": "9898049452",
    zone_name: "Surat",
    circle_name: "Gujarat",
    category: "Challenger",
  },
  {
    tm_number: "9724084105",
    tm_name: "PRADIP BHAI",
    zsm_number: "9974252013",
    zsm_name: "Jay Ambe Communicati",
    zbm_number: "1234567890",
    zbm_name: "ARIF MALEK",
    "ceo/sales_head/marketing_head_number": "9898049452",
    zone_name: "Surat",
    circle_name: "Gujarat",
    category: "Challenger",
  },
  {
    tm_number: "972484103",
    tm_name: "SK BHAI",
    zsm_number: "9974252013",
    zsm_name: "Jay Ambe 2 Communicati",
    zbm_number: "1234567890",
    zbm_name: "ARIF MALEK",
    "ceo/sales_head/marketing_head_number": "9898049452",
    zone_name: "Surat",
    circle_name: "Gujarat",
    category: "Challenger",
  },
  {
    tm_number: "972484103",
    tm_name: "SK BHAI",
    zsm_number: "9974252013",
    zsm_name: "Jay Ambe 3 Communicati",
    zbm_number: "1234567890",
    zbm_name: "ARIF MALEK",
    "ceo/sales_head/marketing_head_number": "9898049452",
    zone_name: "Surat",
    circle_name: "Gujarat",
    category: "Challenger",
  },
];

function groupId(data) {
  const mydata = data.reduce((obj, item) => {
    if (obj[item.tm_number]) {
      obj[item.tm_number].push(item);
    } else {
      obj[item.tm_number] = [item];
    }
    return obj;
  }, {});
  return Object.entries(mydata).map(([k, v]) => ({ [k] : v }));
}

console.log(groupId(data));
.as-console-wrapper { max-height:100% !important; top 0 }

Sign up to request clarification or add additional context in comments.

1 Comment

@MurtazaKhachrodwala apologies for not getting the format right; I should have paid more attention. I've updated my answer to give the desired format.
1

You have wrong comprehension of map function, but the logic of callback in your map function is correct.

Here is explanation of Array.map in MDN.

In your original solution, mydata isn't the answer, variable obj does. Try to print obj variable in your console and you'll see what I'm talking about.

I think the right way to solve this problem is use forEach or just simple for loop. There's no need to make the problem complicated, just keep it simple.

const data = [{
    tm_number: "9724084103",
    tm_name: "PRADIP BHAI",
    zsm_number: "9974252013",
    zsm_name: "Jay Ambe1 Communicati",
    zbm_number: "1234567890",
    zbm_name: "ARIF MALEK",
    "ceo/sales_head/marketing_head_number": "9898049452",
    zone_name: "Surat",
    circle_name: "Gujarat",
    category: "Challenger",
  },
  {
    tm_number: "9724084103",
    tm_name: "PRADIP duplicate",
    zsm_number: "9974252013",
    zsm_name: "Jay Ambe1 Communicati",
    zbm_number: "1234567890",
    zbm_name: "ARIF MALEK",
    "ceo/sales_head/marketing_head_number": "9898049452",
    zone_name: "Surat",
    circle_name: "Gujarat",
    category: "Challenger",
  },
  {
    tm_number: "9724084105",
    tm_name: "PRADIP BHAI",
    zsm_number: "9974252013",
    zsm_name: "Jay Ambe Communicati",
    zbm_number: "1234567890",
    zbm_name: "ARIF MALEK",
    "ceo/sales_head/marketing_head_number": "9898049452",
    zone_name: "Surat",
    circle_name: "Gujarat",
    category: "Challenger",
  },
  {
    tm_number: "972484103",
    tm_name: "SK BHAI",
    zsm_number: "9974252013",
    zsm_name: "Jay Ambe 2 Communicati",
    zbm_number: "1234567890",
    zbm_name: "ARIF MALEK",
    "ceo/sales_head/marketing_head_number": "9898049452",
    zone_name: "Surat",
    circle_name: "Gujarat",
    category: "Challenger",
  },
  {
    tm_number: "972484103",
    tm_name: "SK BHAI",
    zsm_number: "9974252013",
    zsm_name: "Jay Ambe 3 Communicati",
    zbm_number: "1234567890",
    zbm_name: "ARIF MALEK",
    "ceo/sales_head/marketing_head_number": "9898049452",
    zone_name: "Surat",
    circle_name: "Gujarat",
    category: "Challenger",
  },
];

function groupId(data) {
  let obj = {};

  data.forEach(item => {
    if (obj[item.tm_number]) {
      obj[item.tm_number].push(item);
    } else {
      obj[item.tm_number] = [item];
    }
  });

  return [obj];
}
  
console.log(groupId(data));

UPDATE

Since I misread your expected output, I've updated my answer below, have a look!

const data = [
  {
    tm_number: "9724084103",
    tm_name: "PRADIP BHAI",
    zsm_number: "9974252013",
    zsm_name: "Jay Ambe1 Communicati",
    zbm_number: "1234567890",
    zbm_name: "ARIF MALEK",
    "ceo/sales_head/marketing_head_number": "9898049452",
    zone_name: "Surat",
    circle_name: "Gujarat",
    category: "Challenger",
  },
  {
    tm_number: "9724084103",
    tm_name: "PRADIP duplicate",
    zsm_number: "9974252013",
    zsm_name: "Jay Ambe1 Communicati",
    zbm_number: "1234567890",
    zbm_name: "ARIF MALEK",
    "ceo/sales_head/marketing_head_number": "9898049452",
    zone_name: "Surat",
    circle_name: "Gujarat",
    category: "Challenger",
  },
  {
    tm_number: "9724084105",
    tm_name: "PRADIP BHAI",
    zsm_number: "9974252013",
    zsm_name: "Jay Ambe Communicati",
    zbm_number: "1234567890",
    zbm_name: "ARIF MALEK",
    "ceo/sales_head/marketing_head_number": "9898049452",
    zone_name: "Surat",
    circle_name: "Gujarat",
    category: "Challenger",
  },
  {
    tm_number: "972484103",
    tm_name: "SK BHAI",
    zsm_number: "9974252013",
    zsm_name: "Jay Ambe 2 Communicati",
    zbm_number: "1234567890",
    zbm_name: "ARIF MALEK",
    "ceo/sales_head/marketing_head_number": "9898049452",
    zone_name: "Surat",
    circle_name: "Gujarat",
    category: "Challenger",
  },
  {
    tm_number: "972484103",
    tm_name: "SK BHAI",
    zsm_number: "9974252013",
    zsm_name: "Jay Ambe 3 Communicati",
    zbm_number: "1234567890",
    zbm_name: "ARIF MALEK",
    "ceo/sales_head/marketing_head_number": "9898049452",
    zone_name: "Surat",
    circle_name: "Gujarat",
    category: "Challenger",
  },
];

function groupId(data) {
  let obj = {},
    result = [];

  data.forEach((e) => {
    if (obj[e.tm_number]) {
      obj[e.tm_number].push(e);
    } else {
      obj[e.tm_number] = [e];
    }
  });

  const keys = Object.keys(obj);
  for (let i = 0; i < keys.length; i++) {
    result.push({ [keys[i]]: obj[keys[i]] });
  }

  return result;
}

console.log(groupId(data));

5 Comments

reduce I think is more traditional for grouping but this definitely does the job too.
@Nick Agree! However, consider that lots of people don't know how to use reduce correctly. And also, you've already provided the excellent reduce method for this question, so I just want to gave another solution for them.
Absolutely - that's why I upvoted.
@Kurt @Nick Agreed with your solution with reduce and forEach but the thing is output still not matching with the expected output. In the expected output, each key is in a different obj, and then those objects are in the array. Please have a look.
@MurtazaKhachrodwala I've updated my answer to your expected output.

Your Answer

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