Home > Back-end >  How to convert below given array of objects to expected array of object output with specific keys?
How to convert below given array of objects to expected array of object output with specific keys?

Time:10-01

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);

CodePudding user response:

You should use reduce, not map, which is returning multiple copies of obj into your result. Note this code returns an object; if you want an array with the object inside it, change

return mydata;

to

return [mydata];

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 mydata;
}

console.log(groupId(data));

CodePudding user response:

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));

  • Related