Как посчитать количество символов в каждом элементе массива?

Есть массив:

["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 шт):

Автор решения: Igor

//["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));

→ Ссылка
Автор решения: Grundy

Чтобы посчитать для каждого элемента, нужно к каждому элементу применить функцию подсчета.

Для того, чтобы получить один массив на основе другого, можно воспользоваться методом .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}`;
    });
}
→ Ссылка
Автор решения: Vasily

Один из способов это воспользоваться структурами данных 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 ]

→ Ссылка
Автор решения: OPTIMUS PRIME

Через .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 выдало бы ошибку.

→ Ссылка