我有一个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
数组)。但是同样,没关系,只是不要编写试图遵循这些原则的代码,因为它们没有终点。