#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"]]