let array = ['a', 'a', 'a', 'b', 'b', 'c'];
Я хочу сгруппировать двойные значения из массива, чтобы получить такой результат:
результат:
['3a, 2b, c']
(или что-то подобное)
Любая идея?
@NinaScholz именно это



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я бы рекомендовал использовать словарь для отслеживания повторяющихся значений в массиве.
var dictionary = {};
for(var i = 0;i < array.length;i++){
var value = array[i];
if (dictionary[value] === undefined){
dictionary[value] = 0;
}
dictionary[value] = dictionary[value] + 1;
}
console.info(dictionary)
Вы можете использовать методы .reduce() и .map():
let array = ['a', 'a', 'a', 'b', 'b', 'c'];
let result = Object.entries(
array.reduce((r, c) => (r[c] = (r[c] || 0) + 1, r) , {})
).map(([k, v]) => v == 1 ? k : v + k);
console.info(result);Вы также можете использовать Map, если вам нужны предметы в определенном порядке:
let array = ['a', 'a', 'a', 'b', 'b', 'c'];
let result = (((arr, map) => {
arr.forEach(s => map.set(s, (map.get(s) || 0) + 1));
return [...map.entries()].map(([k, v]) => v == 1 ? k : v + k);
})(array, new Map()));
console.info(result);Вы можете использовать Array.reduce() для создания объекта с парами ключ-значение (значение массива и счетчик), а затем Array.map() для создания массива с использованием Object.keys().
let array = ['a', 'a', 'a', 'b', 'b', 'c'];
let countObj = array.reduce((acc, val) => (acc[val] = acc[val] ? acc[val] + 1 : 1, acc), {});
console.info(countObj);
let countArr = Object.keys(countObj).map(key => '' + countObj[key] + key);
console.info(countArr);function count() {
array_elements = ["a", "b", "c", "d", "e", "a", "b", "c", "f", "g", "h", "h", "h", "e", "a"];
array_elements.sort();
var current_elements = null;
var count= 0;
for (var i = 0; i < array_elements.length; i++) {
if (array_elements[i] != current_elements) {
if (cnt > 0) {
console.info(current_elements+count);
}
current_elements= array_elements[i];
count= 1;
} else {
count++;
}
}
if (cnt > 0) {
console.info(current_elements+count);
}
}
Для «чего-то подобного» почему бы просто не создать объект, который сопоставляет букву с вхождением. Затем вы можете просто использовать точечную нотацию, чтобы получить значение свойства, присвоенное каждому ключу.
const arr = ['a', 'a', 'a', 'b', 'b', 'c'];
// `reduce` over the arr
const obj = arr.reduce((acc, c) => {
// If the object (acc) we passed in doesn't have
// a key assigned to the letter in the current
// iteration (c) add it, set it to 0, then
// add one, otherwise, if there is a key, add one
acc[c] = (acc[c] || 0) + 1;
// Return the object for the next iteration
return acc;
// Pass in an initial object
}, {});
console.info(obj);
// Grab the value of `a` property
console.info(obj.a);Подход с одним циклом для простой функции кодирование длин серий (RLE).
let array = ['a', 'a', 'a', 'b', 'b', 'c'],
result = array.reduce(
(r, c, i, a) => r.concat(c === a[i - 1]
? ((+r.pop().slice(0, -1) || 1) + 1) + c
: c),
[]
);
console.info(result);
вы действительно хотите, чтобы в результате была одна строка в массиве? что ты пробовал?