javascript - Javascript递归函数返回未定义
问题描述
我有这个奇怪的问题,对我来说毫无意义。我想念什么?
class AreaManager
{
constructor()
{
this.areas = [];
this.areas.push(new Area('Area1', this));
this.areas[0].areas.push(new Area('AreaABC', this.areas[0]));
this.areas[0].areas[0].areas.push(new Area('AreaABC123', this.areas[0].areas[0]));
this.areas[0].areas.push(new Area('AreaDEF', this.areas[0]));
}
findAreaById(id, areas)
{
areas.forEach(a => {
if(a.id == id)
return a; //console.log() prints the right Area object here
else
return this.findAreaById(id, a.areas);
});
}
}
class Area
{
constructor(id, parent)
{
this.id = id;
this.areas = [];
}
}
var _Manager;
function InitManager()
{
_Manager = new AreaManager();
}
function GetSomeArea()
{
var searchID = 'AreaDEF';
var areaObject = _Manager.findAreaById(searchID);
console.log(areaObject); //this is always undefined
}
我不确定这里有什么问题。即使我尝试在其中返回一个简单的字符串或数字,if(a.id == id)
我也会得到未定义。
希望有人能解释一下。谢谢
解决方案
areas.forEach(a => {
从lambda function
. 它不是从父函数返回的。使用基本的 for 循环来打破循环。
有关更多信息,您可以阅读我的博客:how-to-break-the-loop-in-javascript
class AreaManager {
constructor() {
this.areas = [];
this.areas.push(new Area("Area1", this));
this.areas[0].areas.push(new Area("AreaABC", this.areas[0]));
this.areas[0].areas[0].areas.push(
new Area("AreaABC123", this.areas[0].areas[0])
);
this.areas[0].areas.push(new Area("AreaDEF", this.areas[0]));
}
findAreaById(id, areas = this.areas) {
let merged = [];
for (let i = 0; i < areas.length; i++) {
if (areas[i].id == id) return areas[i];
merged = merged.concat(areas[i].areas);
}
return this.findAreaById(id, merged);
}
}
class Area {
constructor(id, parent) {
this.id = id;
this.areas = [];
}
}
var _Manager;
function InitManager() {
_Manager = new AreaManager();
}
function GetSomeArea() {
var searchID = "AreaDEF";
var areaObject = _Manager.findAreaById(searchID);
console.log(areaObject); //this is always undefined
}
InitManager();
GetSomeArea();
推荐阅读
- javascript - 谁能告诉我为什么会发生 MySQL 语法错误?
- react-native - redux saga dispatch 可以立即返回 api 结果而不是返回 action
- r - 分几个季度报告的年度季度股息
- react-native - React Native Tesseract OCR [错误:数据路径不存在!]
- c# - 查询多对多关系
- jquery - 选择从 MySQL 获取的选项菜单并处理它的值
- cmake - How to install non-standard build target output file using CMake?
- amazon-web-services - 函数中未使用 MemorySize 的 AWS SAM 全局设置
- c - x86-64 在寄存器中传递参数的顺序
- ruby - 为什么 Array#sort 在 OS X 和 Ubuntu 之间的行为不同?