如何在JS中仅当ban相关字段非空时向对象添加ban属性?
问题与解决方案
背景信息
数据库查询SQL
SELECT users.skin, users.name, users.money, users.money_bank, users.fraction_id, users.fraction_id2, users.family_id, users.online_time, ban_list.ban_from, ban_list.ban_to, ban_list.count, ban_list.datetime, ban_list.reason FROM users LEFT OUTER JOIN ban_list ON users.name = ban_list.ban_to WHERE users.social = ? LIMIT 3
查询结果说明
查询返回结果中,ban_from、count、datetime、reason字段可能为NULL(因使用LEFT OUTER JOIN关联表)。
当前构造JSON的JavaScript代码
let charackters = []; let nameData = row['name'].split(" "); charackters.push({ spawnIndex: 0, name: nameData[0], surname: nameData[1], level: 0, cash: row['money'], bank: row['money_bank'], gender: gender, fraction: fraction, family: row['family_id'], playedTime: row['online_time'], ban: { penalty: row['count'], reason: row['reason'], admin: row['ban_from'], dateOfBan: row['datetime'] } }); let charackterObject = { characters: charackters } let charackterJson = JSON.stringify(charackterObject);
问题需求
仅当row['count']、row['reason']、row['ban_from']、row['datetime']全部不为NULL时,才给构造的角色对象添加ban属性,否则不包含该属性。
解决方案
方法1:先构建基础对象,再条件追加属性
先创建不含ban的基础角色对象,判断字段全部非空后再添加ban属性,逻辑直观易懂:
let charackters = []; let nameData = row['name'].split(" "); // 构建基础角色对象 const character = { spawnIndex: 0, name: nameData[0], surname: nameData[1], level: 0, cash: row['money'], bank: row['money_bank'], gender: gender, fraction: fraction, family: row['family_id'], playedTime: row['online_time'] }; // 校验ban相关字段是否全部非空 const hasValidBan = row['count'] !== null && row['reason'] !== null && row['ban_from'] !== null && row['datetime'] !== null; if (hasValidBan) { character.ban = { penalty: row['count'], reason: row['reason'], admin: row['ban_from'], dateOfBan: row['datetime'] }; } charackters.push(character); let charackterObject = { characters: charackters }; let charackterJson = JSON.stringify(charackterObject);
方法2:利用ES6展开运算符实现紧凑写法
通过展开运算符,在对象字面量中动态决定是否添加ban属性,代码更简洁:
let charackters = []; let nameData = row['name'].split(" "); // 校验ban相关字段是否全部非空 const hasValidBan = row['count'] !== null && row['reason'] !== null && row['ban_from'] !== null && row['datetime'] !== null; charackters.push({ spawnIndex: 0, name: nameData[0], surname: nameData[1], level: 0, cash: row['money'], bank: row['money_bank'], gender: gender, fraction: fraction, family: row['family_id'], playedTime: row['online_time'], // 满足条件则展开ban对象,否则展开空对象(不添加属性) ...(hasValidBan ? { ban: { penalty: row['count'], reason: row['reason'], admin: row['ban_from'], dateOfBan: row['datetime'] } } : {}) }); let charackterObject = { characters: charackters }; let charackterJson = JSON.stringify(charackterObject);
内容的提问来源于stack exchange,提问作者Danuh xux
相关产品推荐
相关产品推荐

