2016-04-03 11 views
1

私は非常に限られたJavascriptの知識を使って問題を解決しようとしています。配列内の要素を数え、それらを比較する、javascript

特定の文字が配列に現れる回数を数え、同じ配列内に別の文字が現れる回数と比較する方法を構築しようとしました。

私は4つのテストのうち3つを渡すことができ、私が知る限り多くの方法を試してコードを何度も書き直しました。

私がやったことは効率的ではないことを認識しています...数週間のスキルで問題解決に取り組んでいます。

任意の入力を気に入ってください。ありがとう。

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ループが、あなたはただ1つを使うことができ、その中のすべてのテストをしますか? – 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

関連する問題