2016-01-22 53 views
0

我是一個JavaScript初學者,在做一些CodeWars.com問題。我遇到了這個問題,由於「無法讀取屬性長度爲空」錯誤,我被卡住了。我試圖查找這個錯誤,並且在我的程序中找不到問題所在。使用正則表達式時無法讀取屬性長度空錯誤

分配是:

「檢查,看是否有串有相同數量的‘X’和'O公司的方法必須返回一個布爾值,而且不區分大小寫字符串可以包含任何字符。」

這是我到目前爲止已經寫的:

function XO(str) { 
    var x = "x"; 
    var o = "o"; 
    var numX = str.match(/x/gi).length; 
    var numO = str.match(/o/gi).length; 


    while(str.indexOf(x) > -1 || str.indexOf(o) > -1) { 
     if(numX == numO){ 
     return true; 

     } 
    } 


    if (numX === -1 && numO === -1){ 
     return true; 
    } 

} 

XO("xoxo"); 

這個作業也說,如果有既不是X或O,則程序應返回true。

+1

'match'可以返回'null'和'null.length'將拋出這個錯誤。嘗試'(str.match(/ x/gi)||'').length' – elclanrs

+0

爲什麼你有'while'循環?條件的值在循環體內不會改變。這應該是'如果'。 – Barmar

回答

0

這不會給你那個錯誤。當沒有匹配時,匹配函數返回null,你不能得到null的長度。一些額外的線路解決了這個問題。

function XO(str) { 
 
    var x = "x"; 
 
    var o = "o"; 
 
    var numX = 0; 
 
    var numO = 0; 
 
    var xMatch = str.match(/x/gi); 
 
    var oMatch = str.match(/o/gi); 
 
\t if (xMatch) { 
 
    \t numX = xMatch.length; 
 
    } 
 
    if (oMatch) { 
 
    \t numO = oMatch.length; 
 
    } 
 

 

 
    while(str.indexOf(x) > -1 || str.indexOf(o) > -1) { 
 
     if(numX == numO){ 
 
     return true; 
 

 
     } else { 
 
     return false; 
 
     } 
 
    } 
 

 

 
    if (numX === -1 && numO === -1){ 
 
     return true; 
 
    } else { 
 
     return false; 
 
    } 
 

 
} 
 

 
console.log(XO("ddd"));

0

我覺得你在做這個問題要複雜得多它必須是。

所有你需要做的就是使字符串小寫(考慮不區分大小寫),遍歷字符串,並且當它找到一個x時,向計數器加1,當找到並且o時,從計數器。 如果它結束於0,則返回true,否則返回false。沒有必要對正則表達式

function XO(str){ 
    var count = 0; 
    str = str.toLowerCase(); 
    for(var i = 0; i < str.length; i++){ 
    if(str[i] === 'x') count++; 
    if(str[i] === 'o') count--; 
    } 
    return count === 0 ? true : false; 
} 
0

是你必須檢查的match返回值是不檢查長度屬性之前空。然而

while(str.indexOf(x) > -1 || str.indexOf(o) > -1) { 
    if(numX == numO){ 
    return true; 

    } 
} 

看起來像一個無限循環如果任一字符串包含小寫「X」或「o」和有不同數量的各自的。

更簡單地說:

function XO(str) 
{ var matchX = str.match(/x/gi); 
    var matchY = str.match(/o/gi); 
    return (matchX && matchY) ? matchX.length == matchY.length : !matchX && !matchY; 
}