JavaScript-步行十分钟-如何正确访问数组元素
如果您不熟悉此挑战,请参阅以下说明: 你生活在卡特西亚市,那里所有的道路都以完美的网格布局。你提前十分钟到达,没有预约,所以你决定趁机去散散步。该市为市民的手机上提供了一个步行生成应用程序——每次你按下按钮,它都会向你发送一组表示步行方向的单字母字符串(如[n]、[s]、[w]、[e])。你总是只在一个方向上走一个街区,你知道穿过一个城市街区需要一分钟,所以创建一个函数,如果应用程序给你的步行正好需要十分钟(你不想早或晚!),那么该函数将返回true,当然,它将返回你的起点。否则返回false 到目前为止,我已经尝试:JavaScript-步行十分钟-如何正确访问数组元素,javascript,arrays,function,for-loop,Javascript,Arrays,Function,For Loop,如果您不熟悉此挑战,请参阅以下说明: 你生活在卡特西亚市,那里所有的道路都以完美的网格布局。你提前十分钟到达,没有预约,所以你决定趁机去散散步。该市为市民的手机上提供了一个步行生成应用程序——每次你按下按钮,它都会向你发送一组表示步行方向的单字母字符串(如[n]、[s]、[w]、[e])。你总是只在一个方向上走一个街区,你知道穿过一个城市街区需要一分钟,所以创建一个函数,如果应用程序给你的步行正好需要十分钟(你不想早或晚!),那么该函数将返回true,当然,它将返回你的起点。否则返回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;
}
}
这就是在这个想象的网格上移动
人的原因,但显然它什么也没做。我应该尝试访问数组中的元素并检查它们是否等于“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]--;
}
或者更简洁地说:
switch(walk[i]) {
case "n": person[0]++; break;
case "e": person[1]++; break;
case "s": person[0]--; break;
case "w": person[1]--; break;
}
return person[0] === finalDestination[0] &&
person[1] === finalDestination[1];
其次,person
和finalDestination
是数组,因此==
表示引用相等。也就是说,person===finalDestination
只会在两个变量引用内存中的同一位置时返回true
。相反,您需要比较数组的各个值,例如
if (person[0] === finalDestination[0] &&
person[1] === finalDestination[1]) {
return true;
}
else {
return false;
}
或者更简洁地说:
switch(walk[i]) {
case "n": person[0]++; break;
case "e": person[1]++; break;
case "s": person[0]--; break;
case "w": person[1]--; break;
}
return person[0] === finalDestination[0] &&
person[1] === finalDestination[1];
但是,请注意,finalDestination
永远不会更改,因此您实际上根本不需要该变量。您可以将其替换为:
return person[0] === 0 && person[1] === 0;
关于要求的最后一点:
返回true
如果应用程序给你的步行时间正好是十分钟
您需要将以下内容添加到函数的顶部:
if (walk.length !== 10) return false;
对于更干净的代码,请通过替换i确保您的for
-循环不会超过walk
的末尾。您不能只添加数组。如果您这样做,它们将被转换为字符串,并且您不会将结果存储在某个地方:
[0, 1] + [0, 0]
// equals
"0,1" + "0,0"
您必须将它们逐值相加:
person[0] += west[0];
person[1] += west[1];
另外,此处通过引用比较阵列:
只有当您执行person=finalDestination
时,才是真的。您可能希望再次逐值比较它们:
if(person[0] === finalDestination[0] && person[1] === finalDestination[1])
也就是说,虽然这是可行的,但还有更简单的解决方案(提示:分而治之:N/S和W/E),如果您解决了Kata:,您将看到这一点。)
这是通过6/9测试
一个错误的时钟一天也对两次。如果你愿意:
return Math.random() > 0.5;
平均500次尝试后也能正常工作
我的观点是:通过的测试用例的数量并不是你的解决方案有多错误的一个指标,就像下一个Kata的一个小提示一样。我认为建立这些变量-北
,南
,东
,和西
,基本上是没有意义的?@HappyHands31在这种情况下,它们是不必要的。如果您想表示更复杂的方向(如对角线或骑士在国际象棋中的移动),可能需要实现一种向量/矩阵数学。@HappyHands31不太可能,我称之为干净的代码,如果该模式变得更复杂(更多方向、对角线等),它可能会让您走得更远是的,我还在为步行不到十分钟而犯错。谢谢你提出这个问题,还有你关于改变的观点,他们没有说Cartesia位于哪个曲面上,但是假设它是一个平面,就不需要操纵坐标,只要确保字符串的“n”s和“s”s以及“e”s和“w”s的数目相等即可。