0

i want to add additional wrapper after group by in efficient way

i tried with for each group by, but it created each array item with title based on group value

What want is additional unique wrapper for each group with title as group title and records as actual group item

the expected output i have shown below

const records = [{
    "id": "po_20",
    "name": "po_20",
    "searchtype": "purchaseorders"
  },
  {
    "id": "po_10",
    "name": "po_10",
    "searchtype": "purchaseorders"
  },
  {
    "id": "po_8",
    "name": "po_8",
    "searchtype": "purchaseorders"
  },
  {
    "id": "po_3",
    "name": "po_3",
    "searchtype": "purchaseorders"
  },
  {
    "id": "po_17",
    "name": "po_17",
    "searchtype": "purchaseorders"
  },
  {
    "id": "s1",
    "name": "s1",
    "searchtype": "sale"
  },
  {
    "id": "s2",
    "name": "s2",
    "searchtype": "sale"
  },
  {
    "id": "s3",
    "name": "s3",
    "searchtype": "sale"
  }

];

var groups2 = [];

records.forEach(function(item) {
  var list = groups2[item.searchtype];
  if (list) {
    list.push(item);
  } else {
    groups2[item.searchtype] = [item];
    //groups2[title] = [item.group];
  }
});

console.log(groups2);

var groups3 = [];
groups2.forEach(function(item) {
  console.log("Time");
  var jui = [];
  jui[title] = item[0].searchtype;
  jui[records ] = item;
  groups3.push(jui);
});
console.log(groups3);

I expect the object to be

const records = [{
    title: 'purchaseorders',
    records: [{

        "id": "po_20",
        "name": "po_20",
        "searchtype": "purchaseorders"
      },
      {
        "id": "po_10",
        "name": "po_10",
        "searchtype": "purchaseorders"
      },
      {
        "id": "po_8",
        "name": "po_8",
        "searchtype": "purchaseorders"
      },
      {
        "id": "po_3",
        "name": "po_3",
        "searchtype": "purchaseorders"
      },
      {
        "id": "po_17",
        "name": "po_17",
        "searchtype": "purchaseorders"
      }
    ]
  },

  {
    title: 'sales',
    records: [{
        "id": "s1",
        "name": "s1",
        "searchtype": "sales"
      },
      {
        "id": "s2",
        "name": "s2",
        "searchtype": "sales"
      },
      {
        "id": "s3",
        "name": "s3",
        "searchtype": "sales"
      }
    ]
  }
];
user3815413
  • 385
  • 2
  • 20
  • 1
    Possible duplicate of [How to group an array of objects by key](https://stackoverflow.com/questions/40774697/how-to-group-an-array-of-objects-by-key) – Anurag Srivastava May 26 '19 at 08:16

1 Answers1

0

You can use reduce and group values by searchtype key

const records = [{"id": "po_20","name": "po_20","searchtype": "purchaseorders"},{"id": "po_10",   "name": "po_10","searchtype": "purchaseorders"},{"id": "po_8","name": "po_8","searchtype": "purchaseorders"},{"id": "po_3","name": "po_3","searchtype": "purchaseorders"},{"id": "po_17","name": "po_17","searchtype": "purchaseorders"},{"id": "s1","name": "s1","searchtype": "sale"},{"id": "s2","name": "s2","searchtype": "sale"},{"id": "s3","name": "s3","searchtype": "sale"}];

let final = records.reduce((op,inp) => {
  let title = inp.searchtype 
  op[title] = op[title] || {title, records:[]}
  op[title].records.push(inp)
  return op
},{})


console.log(Object.values(final))
Code Maniac
  • 37,143
  • 5
  • 39
  • 60