【发布时间】:2020-01-04 15:17:00
【问题描述】:
这个想法是消除在一系列方向上的无意义旅行:
'N' = 北
'S' = 南
'E' = 东
'W' = 西
因此,如果我们有数组 ['S', 'E', 'W', 'W'],我们希望 mapQuest 函数返回:
['S', 'W']
由于East和West彼此相邻,因此它们会相互抵消。
*注意方向必须在数组中彼此相邻才能被抵消。
此外,数组应该继续减少,直到最终数组不包含任何对立面 - 即它处理“复杂情况”:
['W', 'N', 'S', 'E', 'N']
应该返回
['N']
因为['W', 'N', 'S', 'E', 'N'] => ['W', 'E', 'N'] => ['N']
这个挑战的一部分是我必须使用reduce 方法。
根据我对.reduce()的理解,我的想法是:
function mapQuest (array) {
return array.reduce((accumulator, current, i) => {
if ((array[i] === 'S' && array[i + 1] !== 'N' && array[i - 1] !== 'N')) {
accumulator.push(array[i]);
}
if ((array[i] === 'N' && array[i + 1] !== 'S' && array[i - 1] !== 'S')) {
accumulator.push(array[i]);
}
if ((array[i] === 'E' && array[i + 1] !== 'W' && array[i - 1] !== 'W')) {
accumulator.push(array[i]);
}
if ((array[i] === 'W' && array[i + 1] !== 'E' && array[i - 1] !== 'E')) {
accumulator.push(array[i]);
}
return accumulator;
}, []);
}
console.log(mapQuest(['S', 'E', 'W', 'W']));
工作但没有通过最后的测试规范 - 处理复杂的情况。
期望['N', 'N', 'E', 'W', 'S', 'S', 'E', 'W', 'N', 'N', 'W', 'S', 'E'] 等于['N', 'N', 'W', 'S', 'E']
【问题讨论】:
-
检查未定义应该在检查元素之前。此外,
match用于匹配正则表达式。对于相等比较,您可以只使用current === 'S'。这样你也可以避免检查未定义。 -
@Slai - 在检查元素之前检查未定义会是什么样子?我试过
if ((current !== undefined && current === 'S' && current[i + 1] !== 'N' || (current !== undefined && current === 'N' && current[i + 1] !== 'S'))) { accumulator.push(current); } -
无需检查未定义。您只需要在 if 语句之后使用
return accumulator;。否则,如果未返回任何内容,则该函数返回 undefined,并且accumulator对于下一个值变为 undefined。如果您不熟悉 reduce 的工作原理,我建议您先从基本的 for 循环开始。此外,您的 if 语句似乎并未处理所有情况。我认为您至少还需要两个。 -
@Slai 我现在要返回累加器,并且有 4 个不同的 if 语句应该考虑所有“相反方向的场景”。有些东西仍然无法正常工作......
-
我认为你很接近。一些逻辑运算符是错误的,只有当 all 条件都满足时才应该推送值。
filter应该比 reduce 更容易。
标签: javascript arrays