如何让JavaScript在无输入值时输出0而非空值?
解决JavaScript空值输出为0的问题
问题根源
你的代码仅在Util.ogl.db.lfBonuses?.[shipID]存在对应属性时才会为目标对象赋值,若属性不存在或值为0(除了fuel的特殊判断),目标对象里就不会生成对应属性,导致输出空值。核心需求是:无输入值时输出0,已有非0值保留原状态。
解决方案
方案1:提前枚举属性并初始化默认值(适用于属性固定的场景)
如果你明确知道所有需要处理的属性名,先给这些属性设置默认值0,再用数据源的非0值覆盖:
Util.ogl.shipsList.forEach(shipID => { // 替换为你实际需要的属性列表,比如attack、defense等 const defaultStats = { attack: 0, defense: 0, shield: 0 }; // 保留原有非0值,同时初始化新属性为0 jsonData[0][0].lifeformBonuses.BaseStatsBooster[shipID] = { ...defaultStats, ...jsonData[0][0].lifeformBonuses.BaseStatsBooster[shipID] }; Object.entries(Util.ogl.db.lfBonuses?.[shipID] || {}).forEach(([key, value]) => { if (key === 'fuel') { // 无fuel值或fuel为0时,输出0 jsonData[0][0].lifeformBonuses.ShipFuelConsumption = value !== 0 ? Math.abs(value / 100) : 0; } else { // 非fuel属性,值为0时也赋值0 jsonData[0][0].lifeformBonuses.BaseStatsBooster[shipID][key] = value / 100; } }); });
方案2:动态处理所有属性(适用于属性不固定的场景)
如果属性名不固定,无法提前枚举,就统一处理所有可能的属性,确保无值时设为0:
Util.ogl.shipsList.forEach(shipID => { // 确保目标对象存在,初始为空对象 const targetBooster = jsonData[0][0].lifeformBonuses.BaseStatsBooster[shipID] || {}; jsonData[0][0].lifeformBonuses.BaseStatsBooster[shipID] = targetBooster; const sourceBonuses = Util.ogl.db.lfBonuses?.[shipID] || {}; // 单独处理fuel:无值或值为0时输出0 jsonData[0][0].lifeformBonuses.ShipFuelConsumption = sourceBonuses.fuel !== undefined ? (sourceBonuses.fuel !== 0 ? Math.abs(sourceBonuses.fuel / 100) : 0) : 0; // 获取所有需要处理的属性:原有属性 + 数据源属性 const allKeys = new Set([...Object.keys(targetBooster), ...Object.keys(sourceBonuses)]); allKeys.forEach(key => { if (key === 'fuel') return; // fuel已单独处理 // 无值时取0,避免空值 const value = sourceBonuses[key] ?? 0; targetBooster[key] = value / 100; }); });
关键说明
- 使用
??空值合并运算符替代||:||会把0当成假值覆盖,而??仅处理undefined或null,能保留合法的0值 - 对
ShipFuelConsumption补充判断:确保无fuel数据时也赋值0 - 覆盖/初始化所有属性:不管原有对象还是数据源里的属性,都确保有值,不会出现空属性
内容的提问来源于stack exchange,提问作者ODIN
相关产品推荐
相关产品推荐

