У меня есть функция, которая извлекает числа из аргументов и возвращает его в виде строки:
function countNumber(smth) {
return String(smth.match(/\d+/));
}
console.log(countNumber('123098h76gfdd')); //=>12309876
countNumbers('erer384jj4444666888jfd123');
// => {'1': 1, '2': 1, '3': 2, '4': 5, '6': 3, '8': 4}
countNumbers('jdjjka000466588kkkfs662555');
// => {'0': 3, '2': 1, '4': 1, '5': 4, '6': 4, '8': 2}
countNumbers(''); // => {}
Теперь мне нужно посчитать количество каждой цифры и создать объект. например, в конце это должно выглядеть так, как показано выше:
Как это сделать правильно? Есть идеи? Помогите пожалуйста!
const countDigits = str => (str.match(/\d/g) || []).reduce(
(rslt, digit) => ((rslt[digit] = ~~rslt[digit] + 1), rslt)
, {});
const printObj = obj => console.log(
JSON.stringify(obj).replace(/[,:]/g, '$& ')
);
printObj(countDigits('erer384jj4444666888jfd123'));
// => {'1': 1, '2': 1, '3': 2, '4': 5, '6': 3, '8': 4}
printObj(countDigits('jdjjka000466588kkkfs662555'));
// => {'0': 3, '2': 1, '4': 1, '5': 4, '6': 4, '8': 2}
printObj(countDigits('')); // => {}
Вместо (str.match(/\d/g) || []) можно [...str.replace(/\D/g, '')] - результат будет одинаков, но у второго варианта возможен +1 проход по символам строки (зависит от внутренней реализации строк, и спред-оператора).
Или так.
var allowed = /\d+/;
var results = Array.prototype.reduce.call("123099998h76gfdd", function (data, letter) {
if (allowed.test(letter)) {
letter = letter.toLowerCase();
if (data[letter] === undefined) {
data[letter] = 0;
}
data[letter] += 1;
}
return data;
}, {});
var o = new Object();
for (var letter in results) {
o[letter] = results[letter]
}
console.log(o);
Можно просто создать еще один объект, перевести строку в массив, и пробежаться по массиву:
var res = new Object();
"ssd243fs20324fs".split("").filter(char => char >= '0' && char <= '9')
.forEach(d => res[d] = (res[d] || 0) + 1)
Сначала выпоняется фильтрация символов: проверка, что символ -- цифра. Далее для каждой цифры инкриментируется счётчик в res.
Результат: { 0: 1, 2: 3, 3: 2, 4: 2 }
Как я писал выше в комментарии, функция (автора вопроса) получения цифр не верная (нет цифр 76):
String('123098h76gfdd'.match(/\d+/)) == "123098"
PS: в старых браузерах или IE может не заработать. Но это поправить легко, и это касается и других ответов.
PPS: на мой взгяд, всякие reduce, используемые в других ответах, мало понятны новичку. Зато каждый, изучающий язык, знает про циклы, т.е. понять forEach должно быть не сложно.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости