我有一个Campaign对象,该对象的campaign_offer数组属性包含N个CampaignOffer子级。

我的目标是访问每个Campaign对象内部的CampaignOffer对象。

为此,我在CampaignOffer对象中添加了一个parent属性,其中包含Campaign对象。

// Parent
var Campaign = function (properties) {
    this.id = properties.id || null;
    this.campaign_offer = [];
};

// Parent: Add a new child in array of children
Campaign.prototype.addOffer = function (offer) {
    // Pass the parent reference to the child
    offer.parent = this;

    this.campaign_offer.push(offer);
};

// Child
var CampaignOffer = function (properties) {
    this.name = properties.name || null;
    this.parent = properties.parent || null;
};

// ---------------------------------------------

// Create the parent
var campaign = new Campaign({ id: 1 });

// Create the child
var campaign_offer = new CampaignOffer({ name: 'test' });

console.log('Offer without parent', campaign_offer);

// Add the child to the parent
campaign.addOffer(campaign_offer);

console.log('Offer with parent', campaign_offer);


您可以在此处看到结果:Fiddle

问题是当您浏览第二个console.log()时。您会发现太多的递归性。喜欢:

parent.campaign_offer[0].parent.campaign_offer[0].parent.campaign_offer[0]...


我了解此输出,但不知道如何避免这种情况。如何定义最大深度?

顺便说一句,它不会造成无限循环。

最佳答案

我了解此输出,但不知道如何避免这种情况。如何定义最大深度?


可以这么说,您没有多个深度,只是有一个循环引用:

  / ------------------------------------------------- -------------------- \
  | + ---------------- + |
  +-> |活动| |
     + ---------------- + |
     |编号:xxx | + ---------- + |
     | campaign_offer | --------> | (数组)| |
     + ---------------- + | ---------- + + ---------------- + |
                                | 0 | -------> | campaign_offer | |
                                + ---------- + + ---------------- + |
                                                    |名称:xxx | |
                                                    |父|-/
                                                    + ---------------- +


循环引用很好,只要您不编写遍历循环引用的代码,而这些代码并不知道它们可能存在,因为该代码可能永远循环下去。

在这种情况下,我看不到需要一个,似乎CampaignOffer具有Campaign是有意义的,但是我看不出相反的含义(campaign_offer数组)。但是同样,没关系,只是不要编写试图遵循这些原则的代码,因为它们没有终点。

10-02 15:48