2017-06-13 62 views
1

我想計算字符串中的所有字符並將其返回給對象。我已經嘗試過,但我無法得到正確的答案。計算字符串中的所有字符

這是我的代碼:

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'));

輸出:

{ b: 0, a: 3, n: 2 } 

這顯然是錯誤的。

任何人都可以幫助我嗎?我哪裏出錯了?

+2

你爲什麼使用嵌套循環? – nnnnnn

+0

你能否詳細說明並給出正確的代碼? –

+2

你真的只需要'obj [s] =(obj [s] || 0)+ 1;'在forEach'回調中。但是,計數字符通常使用'reduce'而不是'forEach'完成。 – Xufox

回答

4

必要的最小變化是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,這是真的。

1

我認爲你需要不使用forEachfor循環在一起的時候,你可以只用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'));

希望它能幫助:)

+0

那真的很有幫助。非常感謝。 –

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; 
    } 
    } 
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'));

4

我會使用一個減少操作,像這樣

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)

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')); 
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聲明。