Как сгруппировать одни и те же элементы в новый массив

#javascript #arrays #algorithm #multidimensional-array #filter

Вопрос:

Ниже приведен массив, содержащий некоторые элементы:

 const arr = ['a', 'b', 'c', 'a', 'b', 'c', 'd']  

Итак, как я могу создать новый массив, в котором одни и те же элементы сгруппированы вместе в новый массив, подобный этому:

 const arr = [['a','a'], ['b','b'], ['c','c'], ['d']]  

Спасибо, что уделили мне время.

Ответ №1:

Этого можно достичь с помощью самых общих group by операций.

 const arr = ['a', 'b', 'c', 'a', 'b', 'c', 'd'];  const grouped = Object.values(arr.reduce((a, n) =gt; ((a[n] ??= []).push(n), a), {}));  console.log(grouped); 

Ответ №2:

Это один из способов сделать это. Более понятный, но более простой для понимания и перевода на другие языки. Time: O(n), Space: O(n), n is number of elements in array

 function process(arr) {  const map = arr.reduce((acc, e) =gt; {  if (!acc.has(e)) {  acc.set(e, 0);  }  acc.set(e, acc.get(e)   1);  return acc;  }, new Map())   const res = [];  for (const[k, v] of map.entries()) {  const localRes = [];  for (let i = 1; i lt;= v; i  ) {  localRes.push(k);  }  res.push(localRes);  }  return res; }  const arr = ['a', 'b', 'c', 'a', 'b', 'c', 'd'] console.log(process(arr));  

Результат:

 [ [ 'a', 'a' ], [ 'b', 'b' ], [ 'c', 'c' ], [ 'd' ] ]  

Ответ №3:

Идея состоит в том, чтобы отсортировать массив в порядке возрастания, затем выполнить итерацию по нему и взять, если последний символ и текущий символ совпадают, и поместить их во внутренний массив, иначе создайте новый внутренний массив этого символа, выполните этот процесс накопления, пока цикл не повторит общие символы.

 ["a","a","b","b","c","c","d"] //sort and do algorithm  ["a","a","b","b","c","c","d"] //^---^ ^---^ [["a","a"],["b","b"],["c","c"],["d"]]  

Реализация:

 const arr = ["a", "b", "c", "a", "b", "c", "d"]; const chars = arr.sort((a, b) =gt; a.localeCompare(b)); console.log(chars); let res = [[]],  lastChar = chars[0]; for (char of chars) {  if (char == lastChar) {  res[res.length - 1].push(char);  } else {  res.push([char]);  lastChar = char;  } }  

Результат:

 console.log(res); //[["a","a"],["b","b"],["c","c"],["d"]]