Skip welcome & menu and move to editor
Welcome to JS Bin
Load cached copy from
 
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
</body>
</html>
 
const group = (
  array, func = v => v, detail = false
) => {
  const index = [];
  const result = [];
  array.forEach(v => {
    const funcResult = func(v);
    const i = index.indexOf(funcResult);
    if (i === -1) {
      index.push(funcResult);
      result.push([v]);
    } else {
      result[i].push(v);
    }
  });
  if (detail) {
    return { index, result };
  }
  return result;
};
const data = [
  {name: 'aaa', age: 18,},
  {name: 'bbb', age: 20,},
  {name: 'bbb', age: 21,},
  {name: 'ccc', age: 21,},
  {name: 'bbb', age: 20,},
];
console.log(
  group(data, d => d.name, {detail: true}),
);
// {
//   index: ['aaa', 'bbb', 'ccc'],
//   result: [
//     [{ name: 'aaa', age: 18 }],
//     [
//       { name: 'bbb', age: 20 },
//       { name: 'bbb', age: 21 },
//       { name: 'bbb', age: 20 },
//     ],
//     [{ name: 'ccc', age: 21 }]
//   ]
// }
console.log(
  group(data, d => d.name, {detail: true})
    .result.map(e => ({ name: e[0].name, count: e.length })),
);
// [
//   { name: 'aaa', count: 1 },
//   { name: 'bbb', count: 3 },
//   { name: 'ccc', count: 1 },
// ]
console.log(
  group(data, d => d.name + d.age.toString(), {detail: true}),
);
// {
//   index: ['aaa18', 'bbb20', 'bbb21', 'ccc21'],
//   result: [
//     [{ name: 'aaa', age: 18 }],
//     [
//       { name: 'bbb', age: 20 },
//       { name: 'bbb', age: 20 },
//     ],
//     [
//       { name: 'bbb', age: 21 },
//     ],
//     [{ name: 'ccc', age: 21 }],
//   ],
// }
console.log(
  group(data, d => d.name + d.age.toString(), {detail: true})
    .result.map(e => ({ name: e[0].name, age: e[0].age, count: e.length })),
);
// [
//   { name: 'aaa', age: 18, count: 1 },
//   { name: 'bbb', age: 20, count: 2 },
//   { name: 'bbb', age: 21, count: 1 },
//   { name: 'ccc', age: 21, count: 1 },
// ],
Output

This bin was created anonymously and its free preview time has expired (learn why). — Get a free unrestricted account

Dismiss x
public
Bin info
anonymouspro
0viewers