【问题标题】:Recursion in Javascript object method with callbackJavascript对象方法中的递归与回调
【发布时间】:2015-02-16 18:13:04
【问题描述】:

我在 javascript 对象方法中遇到了递归问题,希望有人能提供帮助。它可能需要对我的代码进行一些重构。

我正在使用对象工厂创建多个相同类型的对象 - 为简单起见,我们假设对象具有以下属性;

this.objID;
this.dependents      = []; //array of objects linked to this one
this.otherProperty   = "";
this.anotherProperty = "";

现在考虑以下代码:

MyObject.prototype.updateDependents = function() {
    doStuff(this);
    this.getDependents(doStuff);
};


MyObject.prototype.getDependents = function(callback,callback_opts) {
    var deps = [];
    if (typeOf callback !== "function") { callback = false; }
    for (var i = 0; i < this.dependents.length; i++) {
        deps.push(this.dependents[i]);
        if (callback) {
            callback(this.dependents[i],callback_opts);
        }
    }
    return deps;
};

function doStuff(myObj) {
    //..do some stuff to "myObj" (i.e. update other properties)
};

我在一个对象上调用方法“updateDependents”,然后想要获取该对象的所有其他依赖项(存储在“依赖项”属性中)并将函数“doStuff”应用于这些依赖对象.这一点工作正常。

我正在努力解决的问题是如何在依赖于第一个对象的对象上递归调用 getDependents 方法并应用相同的回调函数,然后在任何其他级别的依赖对象等上执行相同的操作(即多个和未知级别的依赖)。

关于最好的方法有什么建议吗???

【问题讨论】:

  • 如果您的所有依赖项都实现了updateDependents 方法,您可以从updateDependents 中循环遍历每个依赖项并调用dependent.updateDependents()
  • 谢谢。应该在回调之后立即添加吗?它会是“this.depependents [i].updateDependents (callback)”吗?
  • 在您的情况下,您不需要将回调作为参数传递,因为您的原型方法也定义了回调方法。 this.depependents [i].updateDependents () 应该可以工作。
  • 干杯,试试看
  • 感谢您的帮助@Karma。得到它来检查下一级家属,但发现 Bergi 的答案最合适。

标签: javascript object recursion methods


【解决方案1】:

您只需在遍历的每个依赖项上调用它:

for (var i = 0; i < this.dependents.length; i++) {
    deps.push(this.dependents[i]);
    deps.push.apply(deps, this.dependents[i].getDependents(callback,callback_opts));
    …

您调用它的顺序(与推送单个依赖项并在其上调用回调的时间相比)决定了traversal order。使用你需要或喜欢的东西。

【讨论】:

  • 谢谢@Bergi,请问'.e.'的功能/含义并在您的答案中添加“应用程序”
  • 抱歉,.e 是 c&p 错误。 apply 使得 push 数组中的所有值成为可能,这里是递归调用返回的值。
  • 谢谢,会试一试
  • 你是明星——对你的代码进行了微小的改动,但工作起来就像一个绝对的魅力;必须将“this.dependents[i]”更改为“obj[this.dependents[i]]”,其中 obj 是包含对象的数组。
猜你喜欢
  • 1970-01-01
  • 2014-11-13
  • 2017-02-05
  • 2017-12-10
  • 2011-10-22
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 1970-01-01
相关资源
最近更新 更多