javascript - 为什么函数返回未定义?
问题描述
我有一个数组,其中的每个值都意味着世界的一侧:
let array = ["NORTH", "SOUTH", "WEST", "EAST"];
如果 NORTH/SOUTH 或 EAST/WEST 站在一起,则这些值将被删除(SOUTH/NORTH 和 WEST/EAST 也被删除)。在这种情况下,函数必须返回空数组,而不是返回 undefined。谁能解释为什么会这样。对不起,我尽量不犯错误
let array = ["NORTH", "SOUTH", "WEST", "EAST"];
let obj = {
"NORTH": 1,
"SOUTH": -1,
"WEST": 2,
"EAST": -2
}
function dirReduc(arr) {
for (let i = 0; i < arr.length; i++) {
if (i == arr.length - 1 || !arr.length) {
return arr;
} else if (obj[arr[i]] + obj[arr[i + 1]] == 0) {
arr.splice(i, 2);
return dirReduc(arr);
}
}
}
console.log(dirReduc(array));
解决方案
当您的递归函数拼接掉所有内容时,如示例中所示,函数的最深嵌套调用将不会迭代循环(因为数组为空),并返回undefined
。该值也将从进行递归调用的点返回,因此主调用也将返回undefined
。
我建议不要使用递归,而是向后迭代。这样splice
调用不会对数组迭代产生负面影响,并且您只需对数组进行一次扫描:
function dirReduc(arr) {
for (let i = arr.length-2; i >= 0; i--) {
if (obj[arr[i]] + obj[arr[i + 1]] == 0) arr.splice(i, 2);
}
return arr;
}
推荐阅读
- javascript - 如何在 VS Code 中为 .Net Core Web 应用程序调试 javascript?
- flutter - 如何在最后使用 TimeofDay 获得 AM 或 Pm,如果它为空,我如何在其上添加一些文本?
- vue.js - this.$state.commit 在页面刷新后失去价值
- java - 想法为spring @Cacheable报告“无法解析变量'result'”(除非=“#result == null”)
- r - kmeans(dataset, k) 中的错误:集群中心多于不同的数据点,未使用的参数(标头 = FALSE),R
- python - 多个字符串列上的隐蔽日期 - PySpark / Databricks
- html - 使用 Flask 显示输出 Flash 消息
- python - 为什么 Tensorflow 在打印出所需的输出之前会打印出很多东西?它在输出中说的有什么问题吗?
- python - 有没有办法使用 Python 在 Excel 中执行类似 SQL 的 Select 语句?
- python - Pandas 根据不同的列值创建新列