-3

I have this string:

item_type = 'a, a, b'

How can I count the values so I would get something like this:

number_of_a = 2
number_of_b = 1

I tried something like below but got some JavaScript for input string "[object Object]" error

if(item_type != null) {
    item_type = item_type.split(",");
    item_type.forEach(function(x) {
        number_of_a[x] = (number_of_a[x] || 0) + 1;
    });
}
Jayme
  • 1,776
  • 10
  • 28
tiredqa_18
  • 162
  • 2
  • 9
  • 1
    Missing `[x]` in `number_of_a || 0` – CherryDT Nov 08 '21 at 10:32
  • thanks for the heads up @CherryDT. fixed it but still getting javascript error: for input string : "[object Object]" it seems – tiredqa_18 Nov 08 '21 at 10:35
  • Does this answer your question? [Count the number of occurrences of a character in a string in Javascript](https://stackoverflow.com/questions/881085/count-the-number-of-occurrences-of-a-character-in-a-string-in-javascript) – TBA Nov 08 '21 at 10:36

3 Answers3

2

reduce is your friend, as with any grouping operation

const item_type = 'a, a, b';
const result = item_type.split(", ").reduce ( (a,i) => {
   a[i] = (a[i] +1 || 1)
   return a;
},{})

console.log(result);
Jamiec
  • 133,658
  • 13
  • 134
  • 193
1

If we are interested in only alphabets, improving the @Tamas Szoke answer.

const str = 'a, a, b'
const chars = {}

for (let char of str) {
  if(char.toUpperCase() != char.toLowerCase()){
    chars[char] = chars[char] + 1 || 1;
  }
}

console.log(chars)
Srikanth
  • 131
  • 8
1

If there could be only a or b you can do it that way:

const item_type = 'a, a, b'

let number_of_a = 0
let number_of_b = 0

if (item_type != null) {
  item_type
      .split(',')
      .map(el => el.trim()) //remove whitespaces from each element
      .forEach(el => el === 'a' ? number_of_a++ : number_of_b++)
}

console.log(`a: ${number_of_a}`)
console.log(`b: ${number_of_b}`)

Otherwise you should use an array or an object:

const item_type = 'a, a, b'

const occurrences = {}

if (item_type != null) {
  item_type
      .split(',')
      .map(el => el.trim()) //remove whitespaces from each element
      .forEach(el => {
        if (!occurrences[el]) {
          occurrences[el] = 1
        } else {
          occurrences[el] += 1
        }
      })
}

for (const [key, value] of Object.entries(occurrences)) {
    console.log(`${key}: ${value}`)
}
wjatek
  • 922
  • 7
  • 22