2016-04-03 60 views
0

我想寫一個函數來計算字母表中的字母與字符串中的字母的匹配。然後,我將每個字母的計數存儲到關聯數組中。我的問題是string.match(regExpression) || [].length返回一個數組。我的期望是它會返回一個匹配長度的整數值。我知道string.prototype.match()方法返回一個數組,但我的理解(基於方法的形式化描述)是Sting.length返回一個數字。返回數組的String.match.length。預期一個整數值。

我在做什麼錯?

function countLetters(string) { 
    //create array with letters of alphabet 
    var alphabet = "abcdefghijklmnopqrstuvwxyz".split(""); 
    var counts = []; 

    for (i = 0; i < alphabet.length; i++) { 
    var regExpression = new RegExp(alphabet[i], "g"); 
    counts[alphabet[i]] = string.match(regExpression) || [].length 
    } 
    return counts; 
} 
+0

如果'string.match'成功,那麼它將返回一個數組...... – elclanrs

+0

那麼忽略'array'和挑'value'出來的,你需要的。 – John

+0

我以爲.length是忽略數組並給我我正在尋找的值的部分。 @john你如何建議我這樣做? – sharly

回答

0

你沒有做錯任何事,但你期待了錯誤的值,在這種情況下,當string.match是正確的它會返回一個數組這是正確的行爲。

該方法用於對一個正則表達式匹配的字符串時來檢索匹配,並在陣列中

+0

謝謝你,艾哈邁德,我期待着從比賽中恢復陣容。然而,我認爲'length'方法會給我特定的值來存儲到關聯數組'counts'中。這是沒有發生的部分,我不明白爲什麼。 – sharly

2

我知道我的錯誤那些與之匹配返回。行string.match(regExpression) || [].length行爲意外,因爲我在調用length方法之前在匹配方法和邏輯運算符周圍缺少括號。正如我正在返回數組或空數組的長度。

我也將counts更改爲一個對象。

這裏的固定功能:

+0

向上投票。我感到驚訝的是沒有人使用數組來代替對象。然而,通常這是你花幾個小時試圖解決的簡單錯誤。 :d – Roberto

0

我了投票OP自己的答案,因爲他已經發現了2個問題,我是要指出,即缺少括號和錯誤的數據類型。然而,因爲我已經寫了代碼,所以我會發布。

var data = 'However beautiful the strategy, you should occasionally look at the results.'; //Winston Churchill 
 

 
// returns an array 
 
function method_A(phrase) { 
 
    var o = [], r; 
 
    'abcdefghijklmnopqrstuvwxyz'.split('').forEach(function(s, i) { 
 
    r = new RegExp(s, 'gi'); 
 
    o[i] = (phrase.match(r) || []).length; 
 
    }); 
 
    return o; 
 
} 
 

 
// returns an object 
 
function method_B(phrase) { 
 
    var o = {}, r; 
 
    'abcdefghijklmnopqrstuvwxyz'.split('').forEach(function(s, i) { 
 
    r = new RegExp(s, 'gi'); 
 
    o[s] = (phrase.match(r) || []).length; 
 
    }); 
 
    return o; 
 
} 
 

 
stdout.innerHTML = (
 
    'input: ' + data + '\n' + 
 
    'method_A: ' + JSON.stringify(method_A(data), false, '') + '\n' + 
 
    'method_B: \n' + JSON.stringify(method_B(data), false, ' ') 
 
);
<xmp id="stdout"></xmp>