首页 > 解决方案 > 是否可以在 Js 中对 switch 语句的情况进行索引?

问题描述

假设我有以下 switch 语句: build.js

const {exec} = require('./exec'); // from child_process
const workers = require('./workers'); // functions to make folders/files
const {html} = require('../snippets/html'); //- 
const {css} = require('../snippets/css');   // |
const {js} = require('../snippets/js');     // | starter files based on extentions
const {py} = require('../snippets/py');     // |
const {java} = require('../snippets/java'); // |
const {cpp} = require('../snippets/cpp');   //-

let build = (project, folder) => {
    switch(project) {
        case 'web':
            workers.buildFile('index.html', html);
            workers.buildFile('style.css',  css);
            workers.buildFile('script.js',  js);
            if(folder !== undefined) {
                workers.buildDir(folder);
                exec(`mv index.html ${folder} && mv style.css ${folder} && mv script.js ./${folder}`);
            }
            break;
        case 'py':
            workers.buildFile('main.py', py);
            if(folder !== undefined) {
                workers.buildDir(folder);
                exec(`mv main.py ${folder}`);
            }
            break;
        case 'java':
            workers.buildFile('main.java', java);
            if(folder !== undefined) {
                workers.buildDir(folder);
                exec(`mv main.java ${folder}`);
            }
            break;
        case 'cpp':
            workers.buildFile('cpp.cpp', cpp);
            if(folder !== undefined) {
                workers.buildDir(folder);
                exec(`mv main.java ${folder}`);
            }
            break;
        default:
            break;
    }
}
// exports function later on

cli.js

const bldr = require('commander'); // commander.
const package = require('./package.json'); //package.json
const {build} = require('../src/worker/lib/utils/build'); // snippets from above
const worker = require('../src/worker/lib/utils/workers'); // makes files/folders

bldr
.action(() => {
        if(bldr.opts('f').filename !== undefined) {
            if(bldr.opts('p') === true) {
                worker.buildFile(bldr.opts('f').filename, () => {
                    if(worker.getExtention(bldr.opts('f').filename)) {
                    // ^---> problem
                    // filename = any single case in switch  --^
                    // statement
                    }
                });
            } else {
                worker.buildFile(bldr.opts('f').filename);
            }
        }
    })

是否可以对“py”、“js”和“java”等进行索引,而不必制作手动数组或单独比较它们?我的实际 switch 语句很快就变得很长,所以如果有更快的方法来做这件事,它会很有帮助。如果您需要更多信息,这里是所有代码在github上的链接。

标签: javascriptswitch-statement

解决方案


如果将非 websnippet 导入放入对象中:

const snippets = { py, java, cpp };

然后可以将非 Web 案例转换为单个部分。switch不需要,它非常冗长,对 IMO 的帮助不够。

let build = (project, folder) => {
    if (project === 'web') {
        workers.buildFile('index.html', html);
        workers.buildFile('style.css', css);
        workers.buildFile('script.js', js);
        if (folder !== undefined) {
            workers.buildDir(folder);
            exec(`mv index.html ${folder} && mv style.css ${folder} && mv script.js ./${folder}`);
        }
    } else if (Object.keys(snippets).includes(project)) {
        const fileName = `main.${project}`;
        workers.buildFile(fileName, snippets[project]);
        if (folder !== undefined) {
            workers.buildDir(folder);
            exec(`mv ${fileName} ${folder}`);
        }
    }
};

要添加更多非 Web 类型,只需将它们添加到snippets对象中即可。


推荐阅读