У меня есть массив:
['Online Learning', 'Online Learning', 'Online Learning', 'Communications', 'Communications', 'Intranet']
Я использую приведенное ниже значение, чтобы найти частоту/встречания каждого значения в этом массиве:
const catsReduced = cats.reduce((acc: any, currentValue: any) => (acc[currentValue] = (acc[currentValue] || 0) + 1, acc), {});
Это выводит:
{Online Learning: 3, Communications: 2, Intranet: 1}
Как бы мне отредактировать приведенный выше редуктор, чтобы он показывал только:
[3,2,1]
(как типы чисел). Я не уверен, что смогу выразиться яснее, но, пожалуйста, скажите, если требуется больше.
Если вы ориентируетесь на версии старше ES2017 и не хотите менять цель на ES2017 или новее, Object.keys() вместе с map также может помочь. Использование этого TS не будет жаловаться



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


Вместо использования объекта для хранения счетчиков вы можете напрямую поместить счетчики в массив.
1- перебираем массив с помощью reduce и подсчитываем вхождения каждого элемента.
2-извлеките значения (счетчики) из полученного объекта, используя Object.values().
3- результирующий массив содержит количество каждого уникального значения в том же порядке, в котором они появляются в исходном массиве.
const cats = ['Online Learning', 'Online Learning', 'Online Learning', 'Communications', 'Communications', 'Intranet'];
const counts = Object.values(cats.reduce((acc, currentValue) => {
acc[currentValue] = (acc[currentValue] || 0) + 1;
return acc;
}, {}));
console.info(counts);Edit: если машинописный текст выдает эту ошибку, попробуйте изменить параметр компилятора lib на es2017 или более позднюю версию, которую, вероятно, можно найти в вашем tsconfig.json файле.
{
"compilerOptions": {
"target": "es2017",
"lib": ["es2017"]
}
}
Должен был сказать, что я использую TypeScript: я получаю сообщение об ошибке, когда значение свойства Object.values не существует для типа ObjectConstructor. Вам нужно изменить целевую библиотеку? Попробуйте изменить параметр компилятора «lib» на «es2017» или более позднюю версию.ts(2550).
@NightTom, вы пишете: «Попробуйте изменить параметр компилятора lib». Кому ты это говоришь? Конечно, у вас должна быть поддержка ECMAScript 2017 (который существует уже более шести лет! — вечность для ИТ).
Я предполагаю, что это его сообщение об ошибке
@trincot - где я это написал?
@NightTom в вашем первом комментарии к этому ответу
ааа - это вывод Visual Studio Code. Не от меня. В любом случае смена компилятора все равно не работает.
Всё равно работает - похоже у меня что-то не так с линтером - слишком он чувствителен. Принятые ответы работают отлично. ОБНОВЛЕНИЕ: Mandy8055 — я использовал Object.keys, это принято. ОБНОВЛЕНИЕ СНОВА! Object.keys не показывает цифры, а показывает текст. Поэтому в данном случае использовать нельзя.
ок, значит, менять библиотеку тогда не было необходимости?
@NightTom нет, это не так. Смотрите здесь: tsplay.dev/w1GA8m
Нет, в этом не было необходимости — код работает, но в линтере, который я использую, есть что-то слишком деликатное.
@mandy8055 - ДА! Идеально, работает блестяще. Я поддержу ваши комментарии.
Альтернативный метод получения частот — использовать Object.groupBy, а затем получить длину каждого массива. (Обратите внимание, что это сокращает код за счет дополнительной траты памяти.)
const cats = ['Online Learning', 'Online Learning', 'Online Learning', 'Communications', 'Communications', 'Intranet'];
const res = Object.values(Object.groupBy(cats, x => x)).map(x => x.length);
console.info(res);