繁体   English   中英

如何分配一个变量的值的变量?

[英]How do I assign a variable of one's variable's value?

我最近遇到了一个问题。

我正在尝试为变量值分配一个值,我正在尝试为我的 Discord 机器人创建一个库系统,它使用 JavaScript (Node.js)

这是我正在努力处理的代码的一部分:

    flist.forEach(item1 => {
        liblist.forEach(item => {
            eval(item1 = require(item));
        });
    });

好的,所以基本上 item1 必须替换为库文件的名称(如果文件名为 cmdh,我将其用作变量名以将require(item)分配给它)

编辑:顺便说一下,item1 是文件名。

编辑 2:这是文件 util.js 的一部分,这里是它的全部内容:

const Discord = require("discord.js");
const fs = require("fs");
function genEmbed(title, desc, col) {
    return new Discord.MessageEmbed().setTitle(title).setDescription(desc).setColor(col);
};
function log(inp) {
    console.log(`[UTIL] ${inp}`);
};

function loadDef() {
    log("Loading libraries...");
    dirlist = [];
    liblist = [];
    flist = [];
    fs.readdir("./libraries", (err, dirs) => {
        if(err) console.error(err);
        dirs.forEach(dir => {
            dirlist.push("./libraries/" + dir); 
        });
        dirlist.forEach(dir => {
            fs.readdir(dir, (err, files) => {
                if(err) console.error(err);
                files.forEach(file => {
                    if(file.includes(".")) {
                        liblist.push(require(dir + "/" + file));
                        filename = file.split(".")[0];
                        flist.push(filename);
                    } else {
                        log(`${file} is a directory, ignoring...`)
                    };
                });
            });
        });
    });
    flist.forEach(item1 => {
        liblist.forEach(item => {
            eval(item1 = require(item));
        });
    });
    log("Libraries loaded!");
};

module.exports = {
    genEmbed,
    loadDef
};

如果您尝试为数组中的每个元素分配一个新值并返回一个包含更新值的新数组,您应该使用map而不是forEach

如果您想从liblist返回一个包含所需库的数组并将结果存储在flist ,您的代码应如下所示:

    flist = liblist.map(item => require(item));

本质上, map从数组中获取每个值,对其应用一个函数(在您的情况下为require ),然后返回一个包含函数结果的新数组。

需要注意的是,还需要将fs.readdir替换为fs.readdirSync ,否则liblist代码时liblist将为空。


在我们对聊天的讨论之后,我了解到您想在主文件中将变量设置为全局变量。 然而,这有点骇人听闻。 为此,您需要修改global对象。

注意:我建议您通过const libraryName = require('./libraries/fileName.js')静态地要求,因为这种动态定义库的方式在这种情况下没有优势,只会使代码更加复杂。 例如,仅当您通过库添加侦听器时动态需要库才有意义,但您不需要将它们存储为全局变量。

utils 文件的完整代码现在应如下所示:

const Discord = require("discord.js");
const fs = require("fs");
function genEmbed(title, desc, col) {
    return new Discord.MessageEmbed().setTitle(title).setDescription(desc).setColor(col);
};
function log(inp) {
    console.log(`[UTIL] ${inp}`);
};

function loadDef() {
    log("Loading libraries...");
    libraries = {};
    const dirlist = fs.readdirSync("./libraries").map(dir => "./libraries/" + dir)
    dirlist.forEach(dir => {
        const files = fs.readdirSync(dir)
        files.forEach(file => {
            if(file.includes(".")) {
                filename = file.split(".")[0];
                libraries[filename] = require(dir + "/" + file);
            } else {
                log(`${file} is a directory, ignoring...`)
            };
        });
    });
    log("Libraries loaded!");
    return libraries;
};

module.exports = {
    genEmbed,
    loadDef
};

现在你仍然需要修改你的主文件中的代码,如下:

const libraries = loadDef()
global = Object.assign(global, libraries) // assign libraries to global variables

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM