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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 13:35:32