Как посчитать, сколько раз определенные символы находятся в строке - программирование
Подтвердить что ты не робот

Как посчитать, сколько раз определенные символы находятся в строке

Я пытаюсь создать функцию, которая проверяет, есть ли какие-либо символы в массиве в строке, и если да, то сколько.

Я пытался рассчитать каждый шаблон, но это слишком много. Я попытался использовать альтернативу оператору "in" из Python, но это тоже не сработало

function calc_fit(element) {
  var fitness_let = ["e", "l", "m", "n", "t"]

  }
}

element - это строка, а массив fitness_let - это массив вещей, которые мне нужно проверить, чтобы увидеть, есть ли они в строке, и если да, то сколько.

4b9b3361

Ответ 1

Вы можете посчитать вхождения с одинаковым значением массива, используя карту и фильтр:

let str="I love JavaScript and Node.js ";
let arr=str.replace(/[^a-zA-Z]/g, '').split('');

const mapped = [...new Set(arr)].map(a => '${a} occurs ${arr.filter(a1 => a1 === a).length  } time(s)');
console.log(mapped);

Ответ 2

Во-первых, и для обобщения метода будет лучше, если calc_fit() также будет принимать массив букв в качестве аргумента. Затем вы можете создать карту из массива со счетчиком каждой буквы, начиная с 0. Наконец, вы пересекаете строку и при необходимости увеличиваете соответствующий счетчик каждой буквы.

function calc_fit(element, fitness_let)
{
    // Create a Map from the array of letters to search.
    let map = new Map(fitness_let.map(l => ([l, 0])));

    // Traverse the string and increment counter of letters.    
    for (const c of element)
    {
        if (map.has(c))
            map.set(c, map.get(c) + 1);
    }
    
    return map;
}

let res = calc_fit("This is a string with some letters", ["e","l","m","n","t"]);
res.forEach((counter, letter) => console.log('${letter} => ${counter}'));
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

Ответ 3

Один из подходов состоит в том, чтобы выполнить итерацию массива и выполнить глобальное удаление регулярных выражений для каждой буквы. Затем сравните длину замененной строки с исходной длиной ввода, чтобы определить количество вхождений.

function calc_fit(element) {
var fitness_let = ["e", "l", "m", "n", "t"];

for (var i=0; i < fitness_let.length; i++) {
    var letter = fitness_let[i];
    var numtimes = element.length - element.replace(new RegExp(letter, 'g'), '').length;
    console.log(fitness_let[i] + " occurs: " + numtimes + " times.");
}

}

var input = "elements are elemental";
calc_fit(input);

Ответ 4

Если вы хотите получить нет. раз появляется каждый символ, чем вы можете использовать reduce и Map

let getTotal = (element) => {
  let fitness = ["e", "l", "m", "n", "t"]
  let newMap = new Map(fitness.map(v=>[v,v]))
  return element.split('').reduce((op,inp)=>{
    if(newMap.has(inp)){
      op[inp] = op[inp] || 0
      op[inp]++
    }
    return op
  },{})
}

console.log(getTotal('element'))
console.log(getTotal('eleabc'))

Ответ 5

Вы можете создать хеш-карту и использовать уменьшение для подсчета всех найденных экземпляров

Пример:

const counts = {};
["e", "l", "m", "n", "t"].forEach( e => counts[e] = 0 );
const letters = "hey look! a string!".split("");
const results = letters.reduce( (acc, curr) => {
	if (acc.hasOwnProperty(curr)) { acc[curr] += 1; }
  return acc;
}, counts);


console.log(results);

Ответ 6

Здесь немного другой подход, основанный на генераторах функций.

Нет никакой соответствующей причины использовать это по сравнению с другими решениями, но это позволяет дать дополнительный контроль над всем циклом.

Как примечание: строка повторяется только один раз, поэтому весь цикл "итерации" должен быть достаточно быстрым.

Объяснение прямо в коде ниже.

Выходные данные - это объект, в котором каждая клавиша представляет собой символ и содержит количество вхождений, в котором содержатся все найденные иглы.

Если массив искомых символов не передается, он автоматически создается внутри функции calc_fit, при этом в отдельности будут возвращаться как прописные, так и строчные буквы, включая знаки пунктуации и символы. Это легко настроить, хотя.

// Iterates a string and yield the current looped char if it exists in the chars list.
function* matchChars(s, chars) {
  for (var char of s) {
    if (chars.indexOf(char) > -1) yield { char: char };
  }
}

// not sure why the function was named in this way in the original code, but hey, it the OP function name.
function calc_fit(element, chars) {
  chars = chars || [...new Set(element)];
  // builds an object from the above array, where the structure has the key which is the char, and the value which is initially 0.
  const matchList = chars.reduce((acc,next) => (acc[next] = 0, acc), {});
  // Iterates all the matches. For each match, it increments the amount of matches of matchList.
  for (var match of matchChars(element, chars)) matchList[match.char]++;
  // finally, returns matchList.
  return matchList;
}

// assertions: should match all the characters.
console.log(calc_fit('element', ["e", "l", "m", "n", "t"]));
// assertions: should return all zeros.
console.log(calc_fit('', ["e", "l", "m", "n", "t"]));
// assertions: should automatically detect chars, even upper case and lower case.
console.log(calc_fit('hello, world. ThIs is beatiful!'));