Javascript递归函数返回未定义

时间:2020-03-25 17:12:35

标签: 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)中返回简单的字符串或数字,也无法定义。

希望有人可以解释这一点。谢谢

1 个答案:

答案 0 :(得分:-1)

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();

相关问题