最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

algorithm - JavaScript Trying to Print The Number of Times a Letter Appears In String But It Prints More than Once - Stack Overf

programmeradmin3浏览0评论

In the code below, I am trying to check how many times a letter in a string appears. Problem with the code below is that it prints each letter more than once. It needs to collect all the same letters and show the number of times it occurs in the string and display it once.

const string = 'mississippi'

const letters = [...string]

let currentLetter = ''
let letterOccurance = []


for(let i = 0; i < letters.length; i++){
  let letterFrequency = letters.filter((letter)=>{
    return letter === letters[i]
  })

  letterOccurance.push([`${letters[i]}`,letterFrequency.length])
}

console.log(letterOccurance)

In the code below, I am trying to check how many times a letter in a string appears. Problem with the code below is that it prints each letter more than once. It needs to collect all the same letters and show the number of times it occurs in the string and display it once.

const string = 'mississippi'

const letters = [...string]

let currentLetter = ''
let letterOccurance = []


for(let i = 0; i < letters.length; i++){
  let letterFrequency = letters.filter((letter)=>{
    return letter === letters[i]
  })

  letterOccurance.push([`${letters[i]}`,letterFrequency.length])
}

console.log(letterOccurance)

Share Improve this question edited Jul 14, 2022 at 17:26 marsprogrammer asked Jul 14, 2022 at 15:28 marsprogrammermarsprogrammer 2411 silver badge9 bronze badges
Add a ment  | 

4 Answers 4

Reset to default 8

That's too much code just to get the number of times a letter appears in a string. Try the following code:

const string = 'mississippi';

let frequency = {};

for (let letter of string) {
  if (frequency[letter]) {
    frequency[letter]++;
  } else {
    frequency[letter] = 1;
  }
}

console.log(frequency);

You're always pushing the letter to the array, whether it already exists there or not:

letterOccurance.push([`${letters[i]}`,letterFrequency.length])

You could check if it exists first:

if (!letterOccurance.find(l => l[0] === letters[i])) {
  letterOccurance.push([`${letters[i]}`,letterFrequency.length])
}

Or even skip it entirely if you've already seen it, since the first time you find any letter you already know its plete count:

for(let i = 0; i < letters.length; i++){
  if (letterOccurance.find(l => l[0] === letters[i])) {
    continue;
  }
  // the rest of the loop...
}

There's honestly a variety of ways you could step back and re-approach the problem. But for the question about why letters are repeating, that's simply because each iteration of the loop unconditionally appends the letter to the resulting array.

How about writing a more generic item-counting function and then layering countLetters as a simple partial application of the identity function?

const countBy = (fn) => ([...xs]) =>
  xs .reduce ((a, x) => {const k = fn (x); a [k] = (a[k] || 0) + 1; return a}, {})

const countLetters = countBy (x => x)

console .log (countLetters ('missisippi'))

countBy is fairly generic. You pass it a function to convert your values to strings, and pass your array of items to the function it returns. Strings are array-like enough that this just works for our simple countLetters. But we could use it for other counts as well, such as:

countBy (x => x .grade) ([{id: 1, grade: 'A'}, {id: 2, grade: 'B'}, {id: 3, grade: 'A'}])
//=> {"A": 2, "B": 1}

Here's a solution using a Set to get the individual letters and String.split() to count.

const countChars = str => Object.fromEntries(
  [...new Set(str)]
  .map(c => [c, str.split(c).length-1])
)

console.log(countChars('mississippi'));

Using reduce to build the object

const countChars = str => [...str].reduce(
  (a, c) => (a[c] ? a[c]++ : a[c]=1, a),
  {}
) 

console.log(countChars('mississippi'));
var result =

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论