如何写一个Nodejs源码扫描工具?

如何写一个Nodejs源码扫描工具?

要检测目录下所有.html, .htm, .js文件中js 数组对象是否包含重复元素 怎么搞呢?

亲们可否提供点思路呢:)

4 回复

当然可以!编写一个Node.js源码扫描工具来检测目录下所有.html, .htm, 和 .js 文件中的JavaScript数组对象是否包含重复元素,可以通过以下步骤实现。我们将使用Node.js的文件系统模块 (fs) 来读取文件,并使用正则表达式来匹配数组对象。

步骤1: 安装必要的依赖

首先,确保你已经安装了Node.js。接下来,创建一个新的项目文件夹并初始化它:

mkdir src-code-scanner
cd src-code-scanner
npm init -y

步骤2: 编写扫描工具

创建一个名为 scanner.js 的文件,并添加以下代码:

const fs = require('fs');
const path = require('path');

// 获取指定目录下的所有文件
function getFiles(dir) {
    const files = [];
    function walk(dir) {
        const list = fs.readdirSync(dir);
        for (const file of list) {
            const filepath = path.join(dir, file);
            const stat = fs.statSync(filepath);
            if (stat.isDirectory()) {
                walk(filepath);
            } else {
                files.push(filepath);
            }
        }
    }
    walk(dir);
    return files;
}

// 检测数组对象中是否有重复元素
function hasDuplicate(arr) {
    const set = new Set();
    for (const item of arr) {
        if (set.has(item)) {
            return true;
        }
        set.add(item);
    }
    return false;
}

// 读取文件内容并检查数组对象
function scanFiles(files) {
    files.forEach(file => {
        if (file.endsWith('.html') || file.endsWith('.htm') || file.endsWith('.js')) {
            const content = fs.readFileSync(file, 'utf-8');
            // 使用正则表达式匹配数组对象
            const regex = /\[\s*['"]([^'"]*)['"]\s*(?:,\s*['"]([^'"]*)['"]\s*)*\]/g;
            let match;
            while ((match = regex.exec(content)) !== null) {
                const arr = match[0].slice(1, -1).split(',').map(s => s.trim().replace(/['"]/g, ''));
                if (hasDuplicate(arr)) {
                    console.log(`File: ${file}, Line: ${content.split('\n')[regex.lastIndex - 1]}`);
                }
            }
        }
    });
}

// 主函数
function main() {
    const directory = process.argv[2];
    const files = getFiles(directory);
    scanFiles(files);
}

main(process.argv[2]);

步骤3: 运行扫描工具

在命令行中运行以下命令来启动扫描工具:

node scanner.js <directory_path>

<directory_path> 替换为你要扫描的目录路径。例如:

node scanner.js ./src

这段代码会遍历指定目录及其子目录中的所有.html, .htm, 和 .js 文件,查找数组对象,并检查这些数组对象中是否存在重复元素。如果发现重复元素,它会打印出包含重复元素的文件名和所在行的内容。

希望这对你有帮助!如果你有任何问题或需要进一步的帮助,请随时提问。


简单点的,正则匹配一下数组,复杂点的,就把编译原理那一坨东西拿来用呗

你会编译原理么,亲:)

要编写一个Node.js源码扫描工具来检测指定目录下的 .html, .htm, 和 .js 文件中的JavaScript数组对象是否包含重复元素,可以使用以下步骤和示例代码。

步骤:

  1. 读取文件:使用 fs 模块递归地读取目录下的所有 .html, .htm, 和 .js 文件。
  2. 提取数组内容:解析文件内容,提取其中的所有数组对象。
  3. 检查重复元素:对于每个数组,检查是否存在重复元素。
  4. 报告结果:将发现的重复元素输出到控制台或保存到文件。

示例代码

const fs = require('fs');
const path = require('path');

// 用于存储文件路径和数组内容
const filesWithArrays = [];

// 读取目录并处理文件
function scanDirectory(directory) {
    const files = fs.readdirSync(directory);

    files.forEach(file => {
        const filePath = path.join(directory, file);
        const stats = fs.statSync(filePath);

        if (stats.isDirectory()) {
            // 如果是目录,递归处理
            scanDirectory(filePath);
        } else {
            // 如果是文件,检查文件扩展名
            const extname = path.extname(filePath).toLowerCase();
            if (extname === '.html' || extname === '.htm' || extname === '.js') {
                processFile(filePath);
            }
        }
    });
}

// 处理单个文件
function processFile(filePath) {
    const content = fs.readFileSync(filePath, 'utf-8');

    // 使用正则表达式提取数组
    const arrayRegex = /(\[[^\]]*\])/g;
    let match;
    while ((match = arrayRegex.exec(content)) !== null) {
        const arrayString = match[1];
        const array = JSON.parse(arrayString.replace(/'/g, '"'));
        
        // 检查数组是否有重复元素
        const seen = new Set();
        for (const item of array) {
            if (seen.has(item)) {
                console.log(`Duplicate element found in ${filePath}:`, item);
            } else {
                seen.add(item);
            }
        }
    }
}

// 开始扫描
const directoryToScan = './your-directory';
scanDirectory(directoryToScan);

解释

  1. 读取文件:我们使用 fs.readdirSync 来读取目录内容,并通过 fs.statSync 检查每个文件是否为目录。如果是目录,则递归调用 scanDirectory。如果是文件,则进一步检查其扩展名是否为 .html, .htm, 或 .js

  2. 提取数组内容:我们使用正则表达式 /\[[^\]]*\]/g 来匹配文件内容中的数组字符串。然后将这些字符串转换为实际的数组对象。

  3. 检查重复元素:我们使用 Set 数据结构来检查数组中是否有重复元素。如果某个元素已经存在于 Set 中,则说明该元素是重复的。

  4. 报告结果:如果发现重复元素,则将其输出到控制台。

以上代码是一个基本的实现框架,可以根据需要进行调整和优化。

回到顶部