Hap*_*s31 3 javascript arrays for-loop function
如果您不熟悉此挑战,请参阅以下说明:
https://www.codewars.com/kata/54da539698b8a2ad76000228/train/javascript
您住在 Cartesia 市,那里的所有道路都以完美的网格布局。你比预约时间早到了十分钟,所以你决定借此机会去散散步。城市为其公民在他们的手机上提供了一个步行生成应用程序——每次你按下按钮,它都会向你发送一组代表步行方向的单字母字符串(例如 ['n', 's', 'w', 'e'])。你总是只朝一个方向走一个街区,而且你知道穿越一个城市街区需要一分钟,所以创建一个函数,如果应用程序给你的步行时间正好是十分钟(你没有想早点或晚点!)当然会让你回到起点。否则返回 false。
到目前为止,我已经尝试过:
function isValidWalk(walk) {
//initiate person starting point
let person = [0, 0]
//establish what the ending point must be
let finalDestination = [0, 0]
let north = [0, 1]
let east = [1, 0]
let south = [0, -1]
let west = [-1, 0]
//as long as the length of the array is 10 or less, continue walk
for (let i = 0; i <= 10; i++) {
//if the letter in the array is "n", move north
if (walk[i] === "n") {
person + north;
}
//if the letter in the array is "e", move east
if (walk[i] === "e") {
person + east;
}
//if the letter in the array is "s", move south
if (walk[i] === "s") {
person + south;
}
//if the letter in the array is "w", move west
if (walk[i] === "w") {
person + west;
}
}
if (person === finalDestination) {
return true;
}
else {
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
这通过了 6/9 测试,但它没有返回true进行有效的步行。
如您所见,我试图说,isValidWalk如果 的位置person等于finalDestination它们行走结束时的变量,则该函数应该返回 true 。
我知道可能有其他方法可以解决这个问题,但如果可能的话,我想继续遵循我已经建立的逻辑。
我想知道我的问题是否是我没有正确访问数组中的元素?即walk[i]在这里正确获取数组元素?
if (walk[i] === "n") {
person + north;
}
Run Code Online (Sandbox Code Playgroud)
这就是应该person在这个假想网格上移动的东西,但显然它没有做任何事情。我应该尝试访问数组中的元素并检查它们是否等于“n”、“e”、“s”和“w”?
首先,JavaScript 数组不像数学矩阵那样工作。array1 + array2不会将这些数组中的各个值加在一起。相反,您必须增加/减少数组中的值:
if (walk[i] === "n") {
person[0]++;
}
if (walk[i] === "e") {
person[1]++;
}
if (walk[i] === "s") {
person[0]--;
}
if (walk[i] === "w") {
person[1]--;
}
Run Code Online (Sandbox Code Playgroud)
或者更简洁:
switch(walk[i]) {
case "n": person[0]++; break;
case "e": person[1]++; break;
case "s": person[0]--; break;
case "w": person[1]--; break;
}
Run Code Online (Sandbox Code Playgroud)
其次,personandfinalDestination是数组,所以===意味着引用相等。也就是说,person === finalDestination只有true当两个变量都指向内存中的相同位置时才会返回。相反,您需要比较数组的各个值,例如
if (person[0] === finalDestination[0] &&
person[1] === finalDestination[1]) {
return true;
}
else {
return false;
}
Run Code Online (Sandbox Code Playgroud)
或者更简洁:
return person[0] === finalDestination[0] &&
person[1] === finalDestination[1];
Run Code Online (Sandbox Code Playgroud)
但是,请注意finalDestination永远不会更改,因此您甚至根本不需要该变量。您可以将其替换为:
return person[0] === 0 && person[1] === 0;
Run Code Online (Sandbox Code Playgroud)
关于要求的最后一点:
true如果应用程序为您提供步行,则返回将带您整整十分钟
您需要将此添加到函数的顶部:
if (walk.length !== 10) return false;
Run Code Online (Sandbox Code Playgroud)
对于更清晰的代码,请确保您的for-loop 不会walk通过替换i <= 10为i < 10或结束i < walk.length。