Javascript 按多个前缀排序数组
我有一个带值的数组。我对它进行分类,有一个条件,就是要将某些项目保持在顶部。到目前为止,这是有效的。现在我想运行两个条件,例如,我有两个前缀要与数组中的每个项匹配:tableprefix和secondaryprefix。我已经取得的成就是将tableprefix保持在首位。其余的项目必须按字母顺序排序 我想要实现的目标:Javascript 按多个前缀排序数组,javascript,sorting,Javascript,Sorting,我有一个带值的数组。我对它进行分类,有一个条件,就是要将某些项目保持在顶部。到目前为止,这是有效的。现在我想运行两个条件,例如,我有两个前缀要与数组中的每个项匹配:tableprefix和secondaryprefix。我已经取得的成就是将tableprefix保持在首位。其余的项目必须按字母顺序排序 我想要实现的目标: columns = [ "es_officer_name", "es_officer_fname", "es_officer_apply_status",
columns = [
"es_officer_name",
"es_officer_fname",
"es_officer_apply_status",
"es_officer_dob",
"es_wl_1_11_test_id",
"es_officer_id",
"es_designation_id",
"es_wl_1_11_test_edit_date",
"es_designation_title",
"es_employment_type_id",
"es_employment_type_name",
"es_service_type_id",
"es_service_type_name",
"es_wl_1_11_test_added_date",
"es_bps_id",
"es_bps_title",
"es_department_id",
"es_department_name"
];
var tablePrefix = "es_wl";
columns.sort(function(a, b)
{
if (a.indexOf(tablePrefix))
{
if (b.indexOf(tablePrefix))
{
return a.localeCompare(b);
}
else
{
return 1;
}
}
else
{
if (b.indexOf(tablePrefix))
{
return -1;
}
else
{
return 0; // All prefixed are considered equal
}
}
});
[
"es_wl_1_11_test_id",
"es_wl_1_11_test_edit_date",
"es_wl_1_11_test_added_date",
"es_bps_id",
"es_bps_title",
"es_department_id",
"es_department_name",
"es_designation_id",
"es_designation_title",
"es_employment_type_id",
"es_employment_type_name",
"es_officer_apply_status",
"es_officer_dob",
"es_officer_fname",
"es_officer_id",
"es_officer_name",
"es_service_type_id",
"es_service_type_name"
]
1:在最顶端匹配tableprefix的数组项//已实现
2:与secondaryprefix匹配的数组项位于tableprefix之后
3:按字母顺序对其余项目进行排序//已完成
数组:
columns = [
"es_officer_name",
"es_officer_fname",
"es_officer_apply_status",
"es_officer_dob",
"es_wl_1_11_test_id",
"es_officer_id",
"es_designation_id",
"es_wl_1_11_test_edit_date",
"es_designation_title",
"es_employment_type_id",
"es_employment_type_name",
"es_service_type_id",
"es_service_type_name",
"es_wl_1_11_test_added_date",
"es_bps_id",
"es_bps_title",
"es_department_id",
"es_department_name"
];
var tablePrefix = "es_wl";
columns.sort(function(a, b)
{
if (a.indexOf(tablePrefix))
{
if (b.indexOf(tablePrefix))
{
return a.localeCompare(b);
}
else
{
return 1;
}
}
else
{
if (b.indexOf(tablePrefix))
{
return -1;
}
else
{
return 0; // All prefixed are considered equal
}
}
});
[
"es_wl_1_11_test_id",
"es_wl_1_11_test_edit_date",
"es_wl_1_11_test_added_date",
"es_bps_id",
"es_bps_title",
"es_department_id",
"es_department_name",
"es_designation_id",
"es_designation_title",
"es_employment_type_id",
"es_employment_type_name",
"es_officer_apply_status",
"es_officer_dob",
"es_officer_fname",
"es_officer_id",
"es_officer_name",
"es_service_type_id",
"es_service_type_name"
]
前缀:
columns = [
"es_officer_name",
"es_officer_fname",
"es_officer_apply_status",
"es_officer_dob",
"es_wl_1_11_test_id",
"es_officer_id",
"es_designation_id",
"es_wl_1_11_test_edit_date",
"es_designation_title",
"es_employment_type_id",
"es_employment_type_name",
"es_service_type_id",
"es_service_type_name",
"es_wl_1_11_test_added_date",
"es_bps_id",
"es_bps_title",
"es_department_id",
"es_department_name"
];
var tablePrefix = "es_wl";
columns.sort(function(a, b)
{
if (a.indexOf(tablePrefix))
{
if (b.indexOf(tablePrefix))
{
return a.localeCompare(b);
}
else
{
return 1;
}
}
else
{
if (b.indexOf(tablePrefix))
{
return -1;
}
else
{
return 0; // All prefixed are considered equal
}
}
});
[
"es_wl_1_11_test_id",
"es_wl_1_11_test_edit_date",
"es_wl_1_11_test_added_date",
"es_bps_id",
"es_bps_title",
"es_department_id",
"es_department_name",
"es_designation_id",
"es_designation_title",
"es_employment_type_id",
"es_employment_type_name",
"es_officer_apply_status",
"es_officer_dob",
"es_officer_fname",
"es_officer_id",
"es_officer_name",
"es_service_type_id",
"es_service_type_name"
]
排序算法:
columns = [
"es_officer_name",
"es_officer_fname",
"es_officer_apply_status",
"es_officer_dob",
"es_wl_1_11_test_id",
"es_officer_id",
"es_designation_id",
"es_wl_1_11_test_edit_date",
"es_designation_title",
"es_employment_type_id",
"es_employment_type_name",
"es_service_type_id",
"es_service_type_name",
"es_wl_1_11_test_added_date",
"es_bps_id",
"es_bps_title",
"es_department_id",
"es_department_name"
];
var tablePrefix = "es_wl";
columns.sort(function(a, b)
{
if (a.indexOf(tablePrefix))
{
if (b.indexOf(tablePrefix))
{
return a.localeCompare(b);
}
else
{
return 1;
}
}
else
{
if (b.indexOf(tablePrefix))
{
return -1;
}
else
{
return 0; // All prefixed are considered equal
}
}
});
[
"es_wl_1_11_test_id",
"es_wl_1_11_test_edit_date",
"es_wl_1_11_test_added_date",
"es_bps_id",
"es_bps_title",
"es_department_id",
"es_department_name",
"es_designation_id",
"es_designation_title",
"es_employment_type_id",
"es_employment_type_name",
"es_officer_apply_status",
"es_officer_dob",
"es_officer_fname",
"es_officer_id",
"es_officer_name",
"es_service_type_id",
"es_service_type_name"
]
排序结果:
columns = [
"es_officer_name",
"es_officer_fname",
"es_officer_apply_status",
"es_officer_dob",
"es_wl_1_11_test_id",
"es_officer_id",
"es_designation_id",
"es_wl_1_11_test_edit_date",
"es_designation_title",
"es_employment_type_id",
"es_employment_type_name",
"es_service_type_id",
"es_service_type_name",
"es_wl_1_11_test_added_date",
"es_bps_id",
"es_bps_title",
"es_department_id",
"es_department_name"
];
var tablePrefix = "es_wl";
columns.sort(function(a, b)
{
if (a.indexOf(tablePrefix))
{
if (b.indexOf(tablePrefix))
{
return a.localeCompare(b);
}
else
{
return 1;
}
}
else
{
if (b.indexOf(tablePrefix))
{
return -1;
}
else
{
return 0; // All prefixed are considered equal
}
}
});
[
"es_wl_1_11_test_id",
"es_wl_1_11_test_edit_date",
"es_wl_1_11_test_added_date",
"es_bps_id",
"es_bps_title",
"es_department_id",
"es_department_name",
"es_designation_id",
"es_designation_title",
"es_employment_type_id",
"es_employment_type_name",
"es_officer_apply_status",
"es_officer_dob",
"es_officer_fname",
"es_officer_id",
"es_officer_name",
"es_service_type_id",
"es_service_type_name"
]
现在我想要的是将所有与tablePrefix“es_wl”
匹配的项目保留在最上面。但同时添加另一个前缀secondaryPrefix“es_officer”
,以便所有匹配的项目都紧跟在“es_wl”项目之后,然后按照通常的字母顺序排序。
我已经看了几个项目,并应用它,但项目甚至没有从他们的位置移动。我想我的逻辑是完全错误的,集成第二个前缀,保留第一个前缀,然后进行排序 在这里完成,运行代码段
var列=[
“官员姓名”,
“高级职员姓名”,
“高级职员申请状态”,
“这是我的长官”,
“es_wl_1_11_测试id”,
“警察身份证”,
“es_标识”,
“es_wl_1_11_测试_编辑_日期”,
“名称”,
“就业类型id”,
“就业类型名称”,
“es_服务类型_id”,
“服务类型名称”,
“已添加测试日期”,
“es_bps_id”,
“es_bps_标题”,
“es_部门id”,
“部门名称”
];
var tablePrefix=“es_wl”;
var secondTablePrefix=“高级职员”
columns.sort((函数(firstPattern,SecondPattern){
this.sorting=函数(a、b、tablePrefix1、primarySort){
如果(a.indexOf(tablePrefix1)!=-1){
如果(b.indexOf(tablePrefix1)!=-1){
返回a.localeCompare(b);
}否则{
返回-1;
}
}else if(b.indexOf(tablePrefix1)!=-1){
返回1;
}否则{
返回primarySort?0:a.localeCompare(b);//所有前缀都被视为相等
}
}
返回函数(a,b){
var结果=排序(a、b、firstPattern,1);
如果(结果==0){
结果=排序(a、b、第二模式,0);
}
返回结果;
}
})(tablePrefix,secondTablePrefix));
log(columns)
您可以使用。将数组设置为字符串,搜索带有前缀的单词:
var str = columns.toString(); // Array to string
var prefix = "es_wl";
var regex = new RegExp(prefix + "[\\w]+,", "g"); // Word with the prefix
var res = str.match(regex).sort(); // The array with the words that starts with the desired prefix
使用多个前缀,可以将它们放入一个数组中。循环遍历数组,将多个正则表达式和已排序的数组放在一起。之后,删除字符串中带有所需前缀的单词,并使用:
总计:
columns = [
"es_officer_name",
"es_officer_fname",
"es_officer_apply_status",
"es_officer_dob",
"es_wl_1_11_test_id",
"es_officer_id",
"es_designation_id",
"es_wl_1_11_test_edit_date",
"es_designation_title",
"es_employment_type_id",
"es_employment_type_name",
"es_service_type_id",
"es_service_type_name",
"es_wl_1_11_test_added_date",
"es_bps_id",
"es_bps_title",
"es_department_id",
"es_department_name"
];
var tablePrefix = "es_wl";
columns.sort(function(a, b)
{
if (a.indexOf(tablePrefix))
{
if (b.indexOf(tablePrefix))
{
return a.localeCompare(b);
}
else
{
return 1;
}
}
else
{
if (b.indexOf(tablePrefix))
{
return -1;
}
else
{
return 0; // All prefixed are considered equal
}
}
});
[
"es_wl_1_11_test_id",
"es_wl_1_11_test_edit_date",
"es_wl_1_11_test_added_date",
"es_bps_id",
"es_bps_title",
"es_department_id",
"es_department_name",
"es_designation_id",
"es_designation_title",
"es_employment_type_id",
"es_employment_type_name",
"es_officer_apply_status",
"es_officer_dob",
"es_officer_fname",
"es_officer_id",
"es_officer_name",
"es_service_type_id",
"es_service_type_name"
]
列=[
“官员姓名”,
“高级职员姓名”,
“高级职员申请状态”,
“这是我的长官”,
“es_wl_1_11_测试id”,
“警察身份证”,
“es_标识”,
“es_wl_1_11_测试_编辑_日期”,
“名称”,
“就业类型id”,
“就业类型名称”,
“es_服务类型_id”,
“服务类型名称”,
“已添加测试日期”,
“es_bps_id”,
“es_bps_标题”,
“es_部门id”,
“部门名称”
];
var prefix1=“es_wl”;
var prefix2=“高级职员”;
var prefix3=“es_部门”;
变量prefixes1=[prefix1,prefix2];
变量prefixes2=[prefix2,prefix1,prefix3];
函数makeCustomOrder(前缀、arr){
var str=columns.toString();
var-res=[];
前缀.forEach((pre,i)=>{
var regex=new RegExp(pre+“[\\w]+,”,“g”);
res=res.concat(str.match(regex.sort());
str=str.replace(regex,“”;//删除带有所需前缀的单词
});
res=res.concat(str.split(,“”.sort());//将排序后的剩余部分放入结果中
返回res;
}
var res=makeCustomOrder(前缀1,列);
var res2=makeCustomOrder(前缀2,列);
console.log(res);//例1
console.log(res2);//例2
谢谢,它确实在对两个前缀进行排序,但它没有做第三项工作,对其余项目进行排序。对不起,起初我忽略了其余的元素我不知道为什么,但出于某种原因,每次我运行它时,我的浏览器中的顺序都会发生变化。它的顺序正确无误。请清除缓存并重试,或者以匿名方式打开它,然后重试。我看到了正确的顺序,我正在chrome上运行mac。让我们来看看。