我想计算字符串中的所有字符并将其返回给对象。我试过但我无法得到正确的答案。
这是我的代码:
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[a[j]]=count;
}
});
return obj;
}
console.log(countAllCharacters('banana'));
&#13;
输出:
{ b: 0, a: 3, n: 2 }
这显然是错误的。
任何人都可以帮助我吗?我哪里错了?
答案 0 :(得分:5)
最小必要的更改是obj[a[j]]=count;
应该是obj[s]=count;
,因为无论j
是否引用了你的字母,你都会在内循环的每次迭代中都运行该行目前正在计算。
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'));
但是,您不需要嵌套循环。您的外.forEach()
可以直接更新当前信件的计数:
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'));
使用.reduce()
:
function countAllCharacters(str) {
return str.split("").reduce(function(obj, s){
obj[s] = (obj[s] || 0) + 1;
return obj;
}, {});
}
console.log(countAllCharacters('banana'));
请注意(obj[s] || 0)
表示使用obj[s]
的值是真实的,否则请使用0
。因此,当您第一次遇到特定字母obj[s]
时,undefined
将为0
,这是假的,因此将使用obj[s]
。下次遇到该字母时,1
将为Route::get('display-pdf', 'ReportAuditController@exportPDF');
,这是真实的。
答案 1 :(得分:4)
我使用 reduce 操作,就像这样
const str = "banana"
const charCounts = Array.from(str).reduce((counts, char) => {
counts[char] = (counts[char] || 0) + 1
return counts
}, Object.create(null))
console.info(charCounts)
&#13;
答案 2 :(得分:3)
实际上,你可以通过更好的表现来计算,你的循环超过了你的需要!
function countAllCharacters(str) {
var a = str.split("");
var obj = {};
for(var j=0;j<a.length;j++){
if(typeof obj[a[j]] !== 'undefined'){
obj[a[j]]+=1;
} else {
obj[a[j]]=1;
}
}
return obj;
}
console.log(countAllCharacters('banana'));
&#13;
答案 3 :(得分:1)
我认为只有forEach
才能使用for
和foreach
循环。这是代码。
function countAllCharacters(str) {
var a = str.split("");
var obj = {};
a.forEach(function(s) {
if (obj[s]) {
obj[s] = obj[s] + 1;
} else {
obj[s] = 1;
}
});
return obj;
}
console.log(countAllCharacters('banana'));
&#13;
希望有所帮助:)
答案 4 :(得分:1)
这里的问题是,当计数尚未完成时,您分配obj[a[j]] = count;
。您应该将function(s)
更改为:
function(s){
var count=0;
for(var j=0;j<a.length;j++){
if(s==a[j]){
count+=1;
}
}
obj[s]=count;
}
另一条评论:您的代码效率非常低,即O(n^2)
。您可以进一步简化它以获得O(n)
算法:
function(s){
if (obj[s] == undefined) {
obj[s] = 1;
} else {
obj[s] = obj[s] + 1;
}
}
答案 5 :(得分:0)
我意识到这不是最漂亮的,但我希望它能说明如何使用控制台来帮助调试循环。
function countAllCharacters(str) {
var a = str.split("");
var obj = {};
a.forEach(function(s){
console.log(s);
var count=0;
for(var j in a){
// commas can come in really handy and help avoid huge debug blocks.
console.log('_',j,s,a[j]);
if(s==a[j]){
console.log('count++');
count++;
}
obj[s] = count;
}
});
return obj;
}
console.log(countAllCharacters('banana'));
答案 6 :(得分:0)
您必须在obj[a[j]]=count
声明中加入if
。
这应该返回正确的结果
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[a[j]]=count
}
}
})
return obj
}
console.log(countAllCharacters('banana'))
obj
中的增量也必须满足if
语句。
答案 7 :(得分:0)
已经有很多朋友提交了他们的观点和不错的解决方案。这是我用最简单的代码解决的方法:
const count = (string) => string
.split("")
.reduce((acc, val) => (acc[val] ? (acc[val]++) : (acc[val]=1), acc),
{});
希望您喜欢我的代码。谢谢。
答案 8 :(得分:0)
function countAllCharacters(str) {
let newArr = str.split(''); // splits the string into a new array
let obj = {}; // initiliza an empty object
newArr.forEach(char => (obj[char]) ? obj[char] += 1 : obj[char] = 1);
return obj;
}