gpt4 book ai didi

数组中的Javascript自定义排序问题

转载 作者:太空宇宙 更新时间:2023-11-04 16:31:03 25 4
gpt4 key购买 nike

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

[ '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/ 之后的第一个文件夹之后在我们的例子中:首先加载帐户、成员(member)资格(可以是更多自定义名称),如下例所示:

  ['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);
}

它的作用是,在参数文件中包含很多带有 js 文件的路径,我试图按照我的规则对它们进行排序。问题在于,以成员(member)资格为例:

  ['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 首先加载,并且该某个文件夹中的任何子文件夹无论如何都会最后加载。

最佳答案

我不确定我是否正确理解了您的意思(如果您能为示例数据添加字面预期输出,那就太好了)。

认为您希望对文件夹进行排序,但在同一文件夹中,您希望其中的文件先于同一文件夹中的任何子文件夹进行排序文件夹。这在每个嵌套级别都应该如此。

要使每个文件夹中的文件首先排序,您实际上应该仅提取文件夹,然后对它们进行排序,并且仅当两个项目具有完全相同的文件夹顺序时,才按文件名排序。

您可以执行以下操作:

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);

排序回调函数说明

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

回调使用变量i来获取值0或1。如果ab的路径是相同,则i将为1,否则为0。它决定是否需要对路径或文件名进行比较。

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

关于数组中的Javascript自定义排序问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39808512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com