Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript-步行十分钟-如何正确访问数组元素_Javascript_Arrays_Function_For Loop - Fatal编程技术网

JavaScript-步行十分钟-如何正确访问数组元素

JavaScript-步行十分钟-如何正确访问数组元素,javascript,arrays,function,for-loop,Javascript,Arrays,Function,For Loop,如果您不熟悉此挑战,请参阅以下说明: 你生活在卡特西亚市,那里所有的道路都以完美的网格布局。你提前十分钟到达,没有预约,所以你决定趁机去散散步。该市为市民的手机上提供了一个步行生成应用程序——每次你按下按钮,它都会向你发送一组表示步行方向的单字母字符串(如[n]、[s]、[w]、[e])。你总是只在一个方向上走一个街区,你知道穿过一个城市街区需要一分钟,所以创建一个函数,如果应用程序给你的步行正好需要十分钟(你不想早或晚!),那么该函数将返回true,当然,它将返回你的起点。否则返回false

如果您不熟悉此挑战,请参阅以下说明:

你生活在卡特西亚市,那里所有的道路都以完美的网格布局。你提前十分钟到达,没有预约,所以你决定趁机去散散步。该市为市民的手机上提供了一个步行生成应用程序——每次你按下按钮,它都会向你发送一组表示步行方向的单字母字符串(如[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的数目相等即可。