我的自定义排序遇到了一些问题。所以,基本上我有这个数组:
[ '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 / 之后的第一个文件夹之后我想要的是什么strong>在我们的例子中:首先加载帐户,成员资格(可以是更多自定义名称),如下一个示例所示:
['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 以及任何最新加载的文件夹中的所有子文件夹。
答案 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
=> 1
,false
=> 0
。