Check this out:
arr=[['a',1], ['a',2], ['a',4], ['b',2], ['C',2], ['d',2], ['e',2], ['e',2], ['n',2]];
const reducedObject = arr
.reduce((acc, [key, value]) => (
acc[key] = acc[key]
? [...acc[key], [key, value]]
: [[key, value]],
acc
), {});
console.log(reducedObject);
// {
// a: [ [ 'a', 1 ], [ 'a', 2 ], [ 'a', 4 ] ],
// b: [ [ 'b', 2 ] ],
// C: [ [ 'C', 2 ] ],
// d: [ [ 'd', 2 ] ],
// e: [ [ 'e', 2 ], [ 'e', 2 ] ],
// n: [ [ 'n', 2 ] ]
// }
const result = Object
.values(reducedObject)
.filter((values) => (values.length >= 2))
.reduce((acc, values) => ([...acc, ...values]), []);
console.log(result);
// [
// [ 'a', 1 ],
// [ 'a', 2 ],
// [ 'a', 4 ],
// [ 'e', 2 ],
// [ 'e', 2 ]
// ]
Another, one-line-way solution:
const result2 = arr
.map(([ key ]) => key) //[ 'a', 'a', 'a', 'b', 'C', 'd', 'e', 'e', 'n' ]
.filter((key, index, array) => array.indexOf(key) !== index) //[ 'a', 'a', 'e' ]
.filter((key, index, array) => array.indexOf(key) === index) //[ 'a', 'e' ]
.reduce((acc, key) => (
[...acc, ...arr.filter(([ itemKey ]) => (itemKey === key))]
), []);
console.log(result2);
// [ [ 'a', 1 ], [ 'a', 2 ], [ 'a', 4 ], [ 'e', 2 ], [ 'e', 2 ] ]