无论节点的扩展名如何,都要比较文件名

时间:2017-06-06 01:05:05

标签: javascript node.js

所以我有一个节点脚本,当前吐出两个数组:

$ yarn run header:test
yarn run v0.22.0
$ ./bin/create_header.js 
[ 'LucidEventIcon.md', 'LucidStates.md' ] [ 'LucidEventIcon.js', 'LucidStates.js' ]

我想做的是使用某种查找方法来说:

" LucideEventIcon.md应匹配LucidEventIcon.js",我关心的是匹配名称。我需要保留文件扩展名,以便稍后将.md的争议添加到.js

如何在名称上匹配,无论扩展名如何?在循环第一个并检查第二个数组时?

对于第一个数组中的两个元素,预期结果应为true,它们应与第二个数组中的两个JS文件匹配。

2 个答案:

答案 0 :(得分:1)

您可以创建自己的小函数来比较基本名称(没有文件扩展名),然后循环遍历第一个为两个数组调用此函数的数组。 path模块可用于解析基本名称(无扩展名或路径)。

const path = require('path');

function compareFileNames(f1, f2) {
    let name1 = path.parse(f1).name;
    let name2 = path.parse(f2).name;
    return name1 === name2;
}

我不清楚你想要什么类型的输出,但你可以创建一个布尔数组,告诉你什么匹配。如果两个数组是arr1arr2

let results = arr1.map(function(f1, index) {
    let f2 = arr2[index];
    return typeof f2 === "string" && compareFileNames(f1, f2);
});

如果您只是想看看它们是否匹配:

let match = arr1.every(function(f1, index) {
    let f2 = arr2[index];
    return typeof f2 === "string"  && compareFileNames(f1, f2);
});

答案 1 :(得分:-2)

更新了isArraysEqual函数,不修改Array.prototype。

   function isArraysEqual(arr1, arr2, strict) {
    if (!arr1 || !arr2)
        return false;

    if (arr1.length != arr2.length)
        return false;

    for (var i = 0; i < arr1.length; i++) {
        if (arr1[i] instanceof Array && arr2[i] instanceof Array) {
            if (!isArraysEqual(arr1[i], arr2[i], strict))
                return false;
        }
        else if (strict && arr1[i] != arr2[i]) {
            return false;
        }
        else if (!strict) {
            return isArraysEqual(arr1.sort(), arr2.sort(), true);
        }
    }
    return true;
}

const mdFiles = [ 'LucidEventIcon.md', 'LucidStates.md' ].map((file)=>file.split('.')[0]);
const jsFiles = [ 'LucidEventIcon.js', 'LucidStates.js' ].map((file)=>file.split('.')[0]);

const isEqual = isArraysEqual(mdFiles, jsFiles, false);