The minimum necessary change is that obj[a[j]]=count; should be obj[s]=count;, because you have that line running on every iteration of the inner loop regardless of whether j refers to the letter you're currently tallying.
function countAllCharacters(str) {
var a = str.split("");
var obj = {};
a.forEach(function(s){
var count=0;
for(var j=0;j<a.length;j++){
if(s==a[j]){
count+=1;
}
obj[s]=count;
}
});
return obj;
}
console.log(countAllCharacters('banana'));
However, you don't need a nested loop. Your outer .forEach() can update the count for the current letter directly:
function countAllCharacters(str) {
var a = str.split("");
var obj = {};
a.forEach(function(s){
obj[s] = (obj[s] || 0) + 1;
});
return obj;
}
console.log(countAllCharacters('banana'));
This can be made shorter with .reduce():
function countAllCharacters(str) {
return str.split("").reduce(function(obj, s){
obj[s] = (obj[s] || 0) + 1;
return obj;
}, {});
}
console.log(countAllCharacters('banana'));
Note that (obj[s] || 0) means to use obj[s]'s value if it is truthy, otherwise use 0. So the first time you encounter a particular letter obj[s] will be undefined, which is falsey, so then 0 will be used. The next time you encounter that letter obj[s] will be 1, which is truthy.