通过Javascript获取有序的文件列表

通过Javascript获取有序的文件列表,javascript,node.js,Javascript,Node.js,我有一个文件夹,其中包含以下文件: s1, s2, s3, ... s9, s10, s11, ... s99, s100, s101, s102, s103, ..., s1, s2, s3, ... s9, s10, s11, ... s99, s100, s101, s102, s103, ..., 和脚本,打印这些文件的列表: filesystem = require('fs'); filesystem.readdirSync('./folder').forEach(function

我有一个文件夹,其中包含以下文件:

s1, s2, s3, ... s9, s10, s11, ... s99, s100, s101, s102, s103, ...,
s1, s2, s3, ... s9, s10, s11, ... s99, s100, s101, s102, s103, ...,
和脚本,打印这些文件的列表:

filesystem = require('fs');
filesystem.readdirSync('./folder').forEach(function (file) {
    console.log(file);
});
但我得到的是这样一个无序的列表:

s0, s1, s10, s100, s101, s102, s103, ... s11, s110, s111, s112, s12
filesystem.readdirSync('./folder', function(err, files) {
    files.sort(function(a, b) {
        a = a.replace(/\w/, ""); //removing 's' or word character
        b = b.replace(/\w/, "");

        return +a - +b;
    }).forEach(function(file) {
        console.log(file);
    });
});
我知道一个原因,但我想得到“编号”有序列表,如下所示:

s0, s1, s10, s100, s101, s102, s103, ... s11, s110, s111, s112, s12
filesystem.readdirSync('./folder', function(err, files) {
    files.sort(function(a, b) {
        a = a.replace(/\w/, ""); //removing 's' or word character
        b = b.replace(/\w/, "");

        return +a - +b;
    }).forEach(function(file) {
        console.log(file);
    });
});
filesystem.readdir('./folder',函数(err,files){
排序(函数(file1、file2){
var file1Int=parseInt(file1.replace(/^\D+/g',),
file2Int=parseInt(file2.replace(/^\D+/g',);
如果(file1Intfile2Int){
返回1;
}
返回0;
}).forEach(函数(文件){
console.log(文件);
});
});

您可以执行以下操作:

s0, s1, s10, s100, s101, s102, s103, ... s11, s110, s111, s112, s12
filesystem.readdirSync('./folder', function(err, files) {
    files.sort(function(a, b) {
        a = a.replace(/\w/, ""); //removing 's' or word character
        b = b.replace(/\w/, "");

        return +a - +b;
    }).forEach(function(file) {
        console.log(file);
    });
});
您可以使用剥离
s
并将其余部分解析为数字,从而对数组进行排序:

filesystem = require('fs');
var result = filesystem.readdirSync('./folder').sort(function (a, b) {
    return (+a.substr(1)) - (+b.substr(1));
});

我觉得,虽然这些答案中的一些现在会起作用,但没有一个适合一般情况,所以我想我应该尝试一种更一般的方法,可能对其他人阅读这个问题有用

function getSort(caseInsensitive) {
    caseInsensitive = !!caseInsensitive;
    // Splits a string in to string and number fragments, parsing integers along the way.
    function getFragments(string) {
        var strings = string.split(/\d/);
        var numbers = string.split(/\D/);
        if (caseInsensitive === true) {
            strings = strings.map(function(string) {
                return string.toLowerCase();
            });
        }
        // Remove any empty strings (there's likely to be one at the start or at the end).
        var fragments = strings.filter(function(value) {
            return value.length > 0;
        });
        var insertIndex = 0;
        // Insert numbers in the correct place in the fragments array.
        for (var i = 0; i < numbers.length; i++) {
            if (numbers[i].length > 0) {
                fragments.splice(insertIndex, 0, parseInt(numbers[i]));
                // Add one to insert index to account for the element we just added.
                insertIndex++;
            }
            insertIndex++;
        }
        return fragments;
    }

    // Actual comparison function.
    return function(lhs, rhs) {
        var lhsFragments = getFragments(lhs);
        var rhsFragments = getFragments(rhs);

        for (var i = 0; i < lhsFragments.length; i++) {
            // Sort right-hand-side in front of left-hand-side if left-hand-side has more fragments.
            if (i >= rhsFragments.length) {
                return 1;
            }
            if (lhsFragments[i] !== rhsFragments[i]) {
                if (lhsFragments[i] < rhsFragments[i]) {
                    return -1;
                } else {
                    return 1;
                }
            }
        }
        // Sort left-hand-side in front of right-hand-side if right-hand-side has more fragments.
        if (lhsFragments.length < rhsFragments.length) {
            return -1;
        }
        return 0;
    }
}

var caseSensitiveSort = getSort();
var caseInsensitiveSort = getSort(true);
var testArray = [
    'x1',
    'X',
    'r22s1',
    'r2s2',
    's2',
    'r1t1',
    'r2',
    's1t1',
    's1',
    's1t2',
    't',
    's'
];
console.log(testArray.sort(caseSensitiveSort));
console.log(testArray.sort(caseInsensitiveSort));

当然,这有点复杂,但不是太复杂。它还应该处理比以前发布的答案多得多的情况,特别是它不会忽略比较中的实际字符串内容。希望它对某些人有用。

文件夹名称不是数字,不能计算为数字,因此按字母顺序排列。但是,如果您有一个特定的命名模式,可以从中可靠地提取数字,则可以创建一个从字符串转换为整数的函数,并使用自定义比较器对列表进行排序。。。除非readdirSync是绝对必要的。其次,它返回已排序的文件名,只是根据字符串对它们进行排序。如果您需要通过数字对它们进行排序,那么您必须从它们的名称中解析整数值,然后应用排序。我重复一遍,但简短一点:您有文件名的特定模式吗?你要处理的每个文件都是
s##
吗?如果你的名字都以“s”开头,然后是一个数字,那么你可以复制对象,删除“s”,然后根据数字排序。是的,文件有s模式,那么我怎么做呢?对他来说这没用。列表已按字母顺序排列。@AlexanderMP--true。排序函数只会返回相同的列表。:)是的,我现在知道了。将我的答案修改为将其转换为数字,然后对其进行排序。只需使用另一个解析文件名的排序函数。排序回调需要返回一个小于0、0或大于0的数字。我猜不会有两个同名的文件,但是…排序回调需要返回一个<0、0或一个>0的数字,而不是布尔值。感谢您的通知。