在打字稿中使用 .map() 来解决空值问题

问题描述 投票:0回答:1

我正在处理一个包含列的 mysql 表 用户、频道、cowner1、cowner2、cowner3 等

将为 cowner1 和 cowner3 设置一个值,但 cowner 2 可以为空。

我想做的是当我更新列时(cowner[num]的最大值为7)我想选择该行中为空的第一列。

map() 似乎采用 null 并且不会添加键。我可能还需要更好的 mysql 调用,因为获取 cowner[num] 的查询是

select * from channels where user = "123"
来获取所有 cowner[num] 值。

我的大脑正在融化。我想避免编写 if 语句来查询每一列。有办法做到吗?

如有任何帮助,我们将不胜感激。

import {
  Client,
  GuildChannel,
  GuildMember,
  ChannelType,
  Message,
  ChannelManager,
  EmbedBuilder,
  MessageMentions,
} from "discord.js";
import { CommandTypes, PrefixCommandModule } from "../../handler/types/Command";
const {
  addcowner,
  getisland,
  adduser,
  addedusers,
  removeban,
} = require("~/extras/functions");

export = {
  name: "addcowner",
  aliases: ["Addcowner", "addowner", "addco"],
  type: CommandTypes.PrefixCommand,
  channelWhitelist: ["1147233774938107966"],
  ownerOnly: true,
  async execute(message: Message): Promise<void> {
    if (message.channel.type !== ChannelType.GuildText) return;
    if (!message.mentions.users.map((m) => m).length) {
      await message.reply("Did you forget to add the user?");
      return;
    }
    const id = await message.mentions.users.first().id;
    const cleanid = await id.replace(/\D/g, "");
    const checkAdds = await addedusers(message.channel.id);
    const channelInfo = getisland(message.channel.id);
    const isAdded = checkAdds.some((added) => added.user === cleanid);
    const cownersArray = [
      channelInfo.cowner1,
      channelInfo.cowner2,
      channelInfo.cowner3,
      channelInfo.cowner4,
      channelInfo.cowner5,
      channelInfo.cowner6,
      channelInfo.cowner7,
    ];
    const filteredOwners: string[] = cownersArray.filter(
      (s): s is string => !!s,
    );
    const cownersMap = new Map();
    let cowners = " ";
    let addlist = " ";
    let cownerNum = cownersMap.size;

    if (id === message.author.id) {
      await message.reply("Seriously? <a:ep_bozabonk:1164312811468496916>");
      return;
    }

    if (!isAdded) {
      await adduser(cleanid, message.channel.id);
      await message.channel.permissionOverwrites.edit(cleanid, {
        ViewChannel: true,
        SendMessages: true,
      });
    }

    for (let i = 0; i < cownersArray.length; i++) {
      await cownersMap.set(`${cownersArray[i]}`, i + 1);
    }
    if (cownersMap.has(cleanid)) {
      await message.reply("user is already a cowner");
      return;
    } else if (cownerNum >= 7) {
      await message.reply(
        "Maximum Cowners is 7. Please use `ep remuser` to make room",
      );
      return;
    } else if (cownersMap.get(null) !== undefined) {
      cownerNum = cownersMap.get(null);
      await addcowner(message.channel.id, cownerNum, cleanid);
      await message.channel.permissionOverwrites.edit(cleanid, {
        ViewChannel: true,
        SendMessages: true,
      });
    }
    for (let i = 0; i < filteredOwners.length; i++) {
      cowners = await cowners.concat(`\n> ${i + 1}. <@!${filteredOwners[i]}>`);
    }

    let embed1 = new EmbedBuilder()
      .setTitle("Channel Manager: Add CO-owner")
      .setDescription(
        `__Current List of C0-owners Users__
                                        ${cowners}\n
                                        *to remove a cowner, use command ep remcowner*`,
      )
      .setColor(`#097969`);

    await message.reply({ embeds: [embed1] });
  },
} as PrefixCommandModule;

--- Mysql 调用 ---

function getislands() {
  return new Promise((resolve) => {
    con.query(`SELECT * FROM channels`, function (err, result) {
      if (err) throw err;
      if (result.length) return resolve(result);
      return resolve(false);
    });
  });
}

function adduser(user, channel) {
  return new Promise((resolve) => {
    con.query(
      `INSERT INTO added (user, channel) VALUES ('${user}', '${channel}')`,
      function (err, result) {
        if (err) throw err;
        resolve("done");
      },
    );
  });
}

function addcowner(channel, number, cowner) {
  return new Promise((resolve) => {
    con.query(
      `UPDATE channels SET cowner${number} = '${cowner}' WHERE channel = '${channel}'`,
      function (err, result) {
        if (err) throw err;
        resolve("added!");
      },
    );
  });
}

function addedusers(channel) {
  return new Promise((resolve) => {
    con.query(
      `SELECT * FROM added WHERE channel = '${channel}'`,
      function (err, result) {
        if (err) throw err;
        // resolve(JSON.parse(JSON.stringify(result[0])))
        resolve(result);
      },
    );
  });
}

Mysql 列

田野 类型 钥匙 默认 额外
用户 varchar(50)
频道 varchar(50)
cowner1 varchar(50)
cowner2 varchar(50)
cowner3 varchar(50)
cowner4 varchar(50)
cowner5 varchar(50)
cowner6 varchar(50)
cowner7 varchar(50)
管理员1 varchar(50) 940093840184975460
管理员2 varchar(50) 936693149114449921
管理员3 varchar(50) 487632896899940356
管理员4 varchar(50) 641203935977144340
管理员5 varchar(50) 710140067951149077
管理员6 varchar(50)
管理员7 varchar(50)
staff_grp varchar(50) 1136168655172947988
活动 小int(1)

没有错误可提供。这是一个关于如何实现上述的逻辑问题。

mysql typescript nullable
1个回答
0
投票

通过使用 Object.entries 将该字符串转换为对象,以及不幸的是一些 if 语句,我能够获取所有值,包括 null。

        Object.entries(channelInfo).forEach(([key, value]) => {
               cowners = cowners.concat(`${key}:${value},`)
        });
        let cownersTemp = cowners.split(",")
                    .map(pair => pair.split(":"));
        const result = Object.fromEntries(cownersTemp);

        function getOwner(obj, value) {
                return Object.keys(obj)
                .filter(key => obj[key] === value);
        }

        if(result.cowner1, result.cowner2, result.cowner3, result.cowner4, result.cowner5, result.cowner6, result.cowner7 === cleanid){
                message.reply("user is already a cowner")
        }else if(result.cowner1, result.cowner2, result.cowner3, result.cowner4, result.cowner5, result.cowner6, result.cowner7 !== cleanid) {
                    let availableSpot = getOwner(result, 'null')
                    if(!availableSpot[0]) {
                            message.reply("You have maxed out available cowners. Remove a cowner to make room")
                            return;
                    }else{
                          insertcowner(message.channel.id, `${availableSpot[0]}`, cleanid)
                    }
        }else{
                message.reply("something happened. contact an admin")
                return;
        }
© www.soinside.com 2019 - 2024. All rights reserved.