Как посчитать количество символов в каждом элементе массива?
Есть массив:
["u\Z%Cm@kc|", "6kmpNvMqQK", "THbw%}\_2L", "}QVMQbik@'", "g}7P5+:?>f"]
Помогите написать функцию с помощью методов которая будет считать количество букв в каждом элементе массива и выводить количество букв отдельно для каждого элемента.
Результатом будет:
["letters: 6", "letters: 9", "letters: 5", "letters: 7", "letters: 3"]
У меня получилось посчитать в общем сколько букв в массиве, но для каждого отдельно не получается.
Код для подсчета общего числа букв:
function isSymbolLetter(array) {
let includedSimbol = 'qwertyuioplkjhgfdsazxcvbnm';
let arrSimbols = array.join('').toLowerCase().split('');
let check = 0;
arrSimbols.forEach(element => {
if (includedSimbol.includes(element)) {
check++;
}
});
return check;
}
Ответы (4 шт):
//["letters: 6", "letters: 9", "letters: 5", "letters: 7", "letters: 3"]
function isSymbolLetter(array) {
return array.map(str => { return {
letters: str.toLowerCase().split('').filter(a => a >= 'a' && a <= 'z').length
}; });
}
let data = ["u\Z%Cm@kc|", "6kmpNvMqQK", "THbw%}\_2L", "}QVMQbik@'", "g}7P5+:?>f"];
console.log(isSymbolLetter(data));
Чтобы посчитать для каждого элемента, нужно к каждому элементу применить функцию подсчета.
Для того, чтобы получить один массив на основе другого, можно воспользоваться методом .map
В итоге получим:
function isSymbolLetter(array) {
let includedSimbol = 'qwertyuioplkjhgfdsazxcvbnm';
return array.map(str => {
var arrSimbols = str.toLowerCase().split('');
let check = 0;
arrSimbols.forEach(element => {
if (includedSimbol.includes(element)) {
check++;
}
});
return `letters: ${check}`;
});
}
Один из способов это воспользоваться структурами данных Map:
const array = ["u\Z%Cm@kc|", "6kmpNvMqQK", "THbw%}\_2L", "}QVMQbik@'", "g}7P5+:?>f"]
const calcLength = array => {
const map = new Map()
for (let str of array) {
map.set(str, `letters: ${str.replace(/[^a-z]/gi, "").length}`)
}
return [...map.values()]
}
const result = calcLength(array)
console.log(result)
// [
// "letters: 6",
// "letters: 9",
// "letters: 5",
// "letters: 7",
// "letters: 3"
// ]
Альтернатива по выводу:
const array = ["u\Z%Cm@kc|", "6kmpNvMqQK", "THbw%}\_2L", "}QVMQbik@'", "g}7P5+:?>f"]
const calcLength = array => {
const map = new Map()
for (let str of array) {
map.set(str, str.replace(/[^a-z]/gi, "").length)
}
return map
}
const result = calcLength(array)
console.log(result)
// не отображается в code-snippet'e SO
// Map {
// "uZ%Cm@kc|" => 6,
// "6kmpNvMqQK" => 9,
// "THbw%}_2L" => 5,
// "}QVMQbik@'" => 7,
// "g}7P5+:?>f" => 3
// }
// или
console.log([...result])
// [
// ["uZ%Cm@kc|", 6],
// ["6kmpNvMqQK", 9],
// ["THbw%}_2L", 5],
// ["}QVMQbik@\'", 7],
// ["g}7P5+:?>f", 3]
// ]
// или
console.log([...result.values()])
// [ 6, 9, 5, 7, 3 ]
Через .match() можно сразу взять все совпадения с буквами:
let arr = ["u\Z%Cm@kc|", "6kmpNvMqQK", "THbw%}\_2L", "}QVMQbik@'", "g}7P5+:?>f"];
arr = arr.map(str => "letters: " + (str.match(/[a-z]/gi) || []).length);
console.log(arr);
Если match вернет null, получится null || [], null в логическом контексте будет false и возьмется второй массив с нулевым length. Иначе null.length выдало бы ошибку.