You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript为对象添加自定义属性时出现无限嵌套问题求助

问题分析与解决:对象添加自身引用导致无限嵌套,存在性判断无效

问题根源

你遇到的无限嵌套问题,核心原因是JavaScript对象是引用类型:当你执行promotion['promotion'] = promotion时,并不是把原对象的“副本”赋值给属性,而是让promotion.promotion直接指向同一个对象。这就意味着,当你访问promotion.promotion时,得到的还是原对象本身,而这个对象又包含了promotion属性,以此类推形成无限嵌套。

至于if (promotion.promotion) continue判断无效,是因为第一次循环时promotion.promotion确实不存在,赋值之后这个属性就指向了对象自身——后续检查时这个属性永远存在,但它本质就是对象自己,所以这个判断根本没法解决问题,因为问题的核心不是重复赋值,而是赋值的内容是对象自身。

解决方案

要实现你期望的“单级引用”,需要为每个对象的promotion属性赋值一个不包含自身引用的原对象副本,而不是对象本身。可以用以下两种方式实现浅拷贝:

方式1:对象展开语法(推荐)

const promotions = [{
    title: 'My offer title',
    subtitle: 'lorem ipsum'
}, {
    title: 'My offer title 2',
    subtitle: 'lorem ipsum'
}, {
    title: 'My offer title 3',
    subtitle: 'lorem ipsum'
}]

for (const [index, promotion] of promotions.entries()) {
    // 浅拷贝原对象,得到不含promotion属性的副本
    const promotionRef = {...promotion};
    promotion.promotion = promotionRef;
}

方式2:Object.assign

const promotions = [{
    title: 'My offer title',
    subtitle: 'lorem ipsum'
}, {
    title: 'My offer title 2',
    subtitle: 'lorem ipsum'
}, {
    title: 'My offer title 3',
    subtitle: 'lorem ipsum'
}]

for (const [index, promotion] of promotions.entries()) {
    const promotionRef = Object.assign({}, promotion);
    promotion.promotion = promotionRef;
}

效果验证

修改后的代码会生成你期望的结构:每个对象的promotion属性是原对象的一个独立副本,仅包含title和subtitle,不会出现无限嵌套的情况。

注意:如果原对象包含嵌套的子对象,浅拷贝只会复制子对象的引用。如果需要完全独立的深拷贝,可以使用JSON.parse(JSON.stringify(promotion))(但该方法无法处理函数、Symbol等特殊类型),你的场景中浅拷贝已经足够。

内容的提问来源于stack exchange,提问作者Ryan H

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 19:25:18