2016-04-03 33 views
1

我試圖用我非常有限的Javascript知識來解決問題。計數數組中的元素並將它們進行比較,javascript

我試圖建立一種方法來計算一個特定的字母出現在一個數組中的次數,並將其與另一個字母出現在同一個數組中的次數進行比較。

我能夠通過3個4測試,並重新編寫代碼多次嘗試儘可能多的方法,我知道。

我意識到我所做的並不高效......只是努力解決問題,並花費數週的時間。

欣賞任何輸入。謝謝。

function isValidWalk(walk) { 
 
var north = new Object(); 
 
var south = new Object(); 
 
var east = new Object(); 
 
var west = new Object(); 
 
for (var i = 0; i <walk.length; i++){ 
 
if (walk[i] == "n") 
 
{north.input = "x"} 
 
} 
 
for (var i = 0; i <walk.length; i++){ 
 
if (walk[i] == "s") 
 
{south.input = "x"} 
 
} 
 
for (var i = 0; i <walk.length; i++){ 
 
if (walk[i] == "e") 
 
{east.input = "x"} 
 
} 
 
for (var i = 0; i <walk.length; i++){ 
 
if (walk[i] == "w") 
 
{west.input = "x"} 
 
} 
 

 

 

 
if (north.input == south.input && east.input == west.input && walk.length==10) { 
 
return true; 
 
} 
 
else { 
 
return false; 
 
} 
 
}

+0

請加步行的內容。 –

+0

有一件事立即想起來:爲什麼所有這些'for'循環,當你只能使用一個循環,並且在它裏面進行所有的測試? – blex

+0

你不需要多重循環。改用'switch(walk [i])'來代替。 – Andy

回答

0

這裏是我會怎麼做:

function isValidWalk(walk) { 
 
    var steps = {n: 0, s: 0, e: 0, w: 0}; 
 

 
    for (var i=0, l=walk.length; i<l; i++) { 
 
     if (steps.hasOwnProperty(walk[i])) { 
 
      steps[walk[i]]++; 
 
     } else { 
 
      return false; // The element is not "n","s","e", or "w" 
 
     } 
 
    } 
 

 
    return (steps.n == steps.s && steps.e == steps.w && walk.length == 10); 
 
} 
 

 
console.log(isValidWalk(['n','n','n','s','n','s','n','s','n','s'])); // returns false 
 
console.log(isValidWalk(['n','n','n','s','s','s','n','s']));   // returns false 
 
console.log(isValidWalk(['n','gg','hh','s','s','s','n','s','n','n'])); // returns false 
 
console.log(isValidWalk(['n','n','n','s','s','s','n','s','n','s'])); // returns true

+0

請不要在數組中使用'for ... in'。 –

+1

@NinaScholz好吧,我改變了它。 – blex

+0

謝謝你。我也重寫了使用開關,並通過了兩個版本。另外我瞭解了hasOwnProperty方法。 – Fountainhead

相關問題