数组

时间:2016-10-01 15:44:40

标签: javascript sorting

我的自定义排序遇到了一些问题。所以,基本上我有这个数组:

[ 'src/app/account/account.js',
  'src/app/account/dashboard/characters/characters.js',
  'src/app/account/dashboard/characters/detail/detail.js',
  'src/app/account/dashboard/dashboard.ctrl.js',
  'src/app/account/dashboard/dashboard.js',
  'src/app/account/dashboard/panels/admin.ctrl.js',
  'src/app/account/dashboard/panels/users.ctrl.js',
  'src/app/account/donate/donate.ctrl.js',
  'src/app/account/donate/donate.js',
  'src/app/account/settings/settings.ctrl.js',
  'src/app/account/settings/settings.js',
  'src/app/account/vote/vote.ctrl.js',
  'src/app/account/vote/vote.js',
  'src/app/membership/dialogs/login.ctrl.js',
  'src/app/membership/dialogs/register.ctrl.js',
  'src/app/membership/dialogs/termsOfService.ctrl.js',
  'src/app/membership/membership.ctrl.js',
  'src/app/membership/membership.module.js',
  'src/app/news/news.ctrl.js',
  'src/app/news/news.js',
  'src/app/noctis.ctrl.js',
  'src/app/noctis.js',
  'src/app/widgets/playersOnline/playersOnline.js',
  'src/app/widgets/rankings/rankings.js',
  'src/app/widgets/serverDetails/serverDetails.js',
  'src/common/directives/feeds/feeds.js',
  'src/common/directives/panel/panel.js' ]

src / app / 之后的第一个 js src / app / 在我们的例子中:首先加载帐户,成员资格(可以是更多自定义名称),如下一个示例所示:

  ['src/app/membership/membership.module.js',
  'src/app/membership/membership.ctrl.js',
  'src/app/membership/dialogs/login.ctrl.js',
  'src/app/membership/dialogs/register.ctrl.js',
  'src/app/membership/dialogs/termsOfService.ctrl.js',]

你能帮助我一些代码来满足我的需求吗?除 src / app / 之后的下一个目录外, src / app 始终是固定名称。

基本上是在 src / app 之后的目录的未知名称之后,我们的情况下的子目录(对话框)或者可能是其他类似(详细信息,细节/字符)的内容无论如何都装最新。

基本上这是整个功能:

function sortJSFiles(files) {
        var src = [];
        var vendor = [];
        files.forEach(function(item) {
            if (item.startsWith('src')) {
                src.push(item);
            } else {
                vendor.push(item);
            }
        });

        src.sort(function(a, b) {
            var replace = ['noctis.js', 'noctis.ctrl.js', '.module.js', '.ctrl.js'];

            function replaceCB(previousValue, currentValue, currentIndex, array) {
                return previousValue.replace(currentValue, currentIndex);
            }
            return replace.reduce(replaceCB, a).localeCompare(replace.reduce(replaceCB, b));
        });
        return vendor.concat(src);
    }

它的作用是,在paramater文件中有很多js文件的路径,并且我试图在我的规则之后对它们进行排序。问题是,例如采用成员资格示例:

  ['src/app/membership/dialogs/login.ctrl.js',
  'src/app/membership/dialogs/register.ctrl.js',
  'src/app/membership/dialogs/termsOfService.ctrl.js',
  'src/app/membership/membership.module.js',
  'src/app/membership/membership.ctrl.js']

它成功地改变了类似加载* .js文件的排序,首先使用.module.js而不是.ctrl.js但是我的代码中存在一个问题,我需要在之后出现的任何js文件首先加载src / app / somefolder 以及任何最新加载的文件夹中的所有子文件夹。

1 个答案:

答案 0 :(得分:1)

我不确定我是否理解正确(如果您为样本数据添加了文字预期输出,那就太好了)。

认为你希望对这些文件夹进行排序,但是在同一个文件夹中,你希望那里的文件在之前对其中的任何子文件夹进行排序夹。这应该适用于每个嵌套级别。

要在每个文件夹中首先排序文件,您实际上应该只提取文件夹并对其进行排序,并且只有当两个项目具有完全相同的文件夹序列时,才按文件名排序。

您可以这样做:

src = src.map(function (path) {
    var i = path.lastIndexOf('/');
    return [path.substr(0, i), path.substr(i)];
}).sort(function (a, b) {
    var i = +(a[0] == b[0]);
    return  a[i].localeCompare(b[i]);
}).map(function (pair) {
    return pair[0] + pair[1];
});



var src = [ 'src/app/account/account.js',
  'src/app/account/dashboard/characters/characters.js',
  'src/app/account/dashboard/characters/detail/detail.js',
  'src/app/account/dashboard/dashboard.ctrl.js',
  'src/app/account/dashboard/dashboard.js',
  'src/app/account/dashboard/panels/admin.ctrl.js',
  'src/app/account/dashboard/panels/users.ctrl.js',
  'src/app/account/donate/donate.ctrl.js',
  'src/app/account/donate/donate.js',
  'src/app/account/settings/settings.ctrl.js',
  'src/app/account/settings/settings.js',
  'src/app/account/vote/vote.ctrl.js',
  'src/app/account/vote/vote.js',
  'src/app/membership/dialogs/login.ctrl.js',
  'src/app/membership/dialogs/register.ctrl.js',
  'src/app/membership/dialogs/termsOfService.ctrl.js',
  'src/app/membership/membership.ctrl.js',
  'src/app/membership/membership.module.js',
  'src/app/news/news.ctrl.js',
  'src/app/news/news.js',
  'src/app/noctis.ctrl.js',
  'src/app/noctis.js',
  'src/app/widgets/playersOnline/playersOnline.js',
  'src/app/widgets/rankings/rankings.js',
  'src/app/widgets/serverDetails/serverDetails.js',
  'src/common/directives/feeds/feeds.js',
  'src/common/directives/panel/panel.js' ];

src = src.map(function (path) {
    var i = path.lastIndexOf('/');
    return [path.substr(0, i), path.substr(i)];
}).sort(function (a, b) {
    var i = +(a[0] == b[0]);
    return  a[i].localeCompare(b[i]);
}).map(function (pair) {
    return pair[0] + pair[1];
});

console.log(src);




排序回调函数的说明

排序回调函数将接收参数 a b 。它们中的每一个都是一对,包括索引为0的路径和索引为1的文件名。

回调使用一个变量 i ,用于获取值0或1.如果 a b 的路径是同样,那么 i 将为1,否则它将为0.它确定是否需要在路径或文件名上进行比较。

单一+用于将布尔表达式a[0] == b[0]转换为数字。转化为:true => 1false => 0