Javascript 如何根据另一个数组的值对数组进行排序?
我有一个数组,它有以下值Javascript 如何根据另一个数组的值对数组进行排序?,javascript,arrays,sorting,Javascript,Arrays,Sorting,我有一个数组,它有以下值 Nata_sha_AD8_02_ABA Jack_DD2_03_K Alex_AD8_01_PO Mary_CD3_03_DC John_DD2_01_ER Daniel_AD8_04_WS 我想根据以下数组对它们进行分组['AD8'、'CD3'、'DD2'、'PD0'];并根据每个值的数量对每个组进行排序。所以输出应该是 Alex_AD8_01_PO Nata_sha_AD8_02_ABA Daniel_AD8_04_WS Mary_CD3_03_DC John_
Nata_sha_AD8_02_ABA
Jack_DD2_03_K
Alex_AD8_01_PO
Mary_CD3_03_DC
John_DD2_01_ER
Daniel_AD8_04_WS
我想根据以下数组对它们进行分组['AD8'、'CD3'、'DD2'、'PD0'];并根据每个值的数量对每个组进行排序。所以输出应该是
Alex_AD8_01_PO
Nata_sha_AD8_02_ABA
Daniel_AD8_04_WS
Mary_CD3_03_DC
John_DD2_01_ER
Jack_DD2_03_K
到目前为止,我编写了以下代码,但它不能正常工作,我被困在这里
var temparr = [];
var order = 1000;
var pos = -1;
var temp = -1;
var filterArray= ['AD8','CD3','DD2','PD0'];
for (i =0; i< filterArray.length; i++) {
for (j =0; j < myarray.length; j++) {
if(filterArray[i].toUpperCase().search(myarray[j])>0){
temp = str.substring(myarray[j].indexOf(filterArray[i])+4, myarray[j].indexOf(filterArray[i]+6);
if(temp < order){
pos = j;
order = temp;
}
if(j == myarray.length-1){ //reached end of the loop
temparr.push(myarray[pos]);
order = 1000;
}
}
}
}
var temparr=[];
var阶数=1000;
var pos=-1;
var-temp=-1;
变量filterArray=['AD8'、'CD3'、'DD2'、'PD0'];
对于(i=0;i0{
temp=str.substring(myarray[j].indexOf(filterArray[i])+4,myarray[j].indexOf(filterArray[i]+6);
如果(温度<订单){
pos=j;
订单=温度;
}
如果(j==myarray.length-1){//到达循环的末尾
temparr.push(myarray[pos]);
订单=1000;
}
}
}
}
基于筛选数组是按字母顺序排列的,并且每个字符串都有一个子字符串,其格式为您实际想要排序的\u XXN\u NN
,只需根据提取的子字符串进行排序就足够了,无需参考filterArray
:
var name=['Nata_sha_AD8_02_ABA','Jack_DD2_03_K','Alex_AD8_01_PO','Mary_CD3_03_DC','John_DD2_01_ER','Daniel_AD8_04_WS'];
名称.排序(函数(a,b){
风险值re=/(AD8 | CD3 | DD2 | PD0)d\d)u/;
a=a.匹配(re)[1];
b=b.匹配(re)[1];
返回a.localeCompare(b);
});
alert(names);
使用第一个sort
参数,您可以传递一个函数来运行以对数组进行排序。此函数接收数组的两个值,并将它们进行比较,如果第一个值低于第二个值,则返回小于0;如果值高于第二个值,则返回大于0;如果值相同,则返回0。在我的命题中,我将名称和“标记”是值的一部分,然后比较标记以正确排序。使用filterArray上的indexOf
,我可以相应地比较标记的位置
var array\u to\u sort=['Natasha\u AD8\u 02',
“Jack_DD2_03”,
“Alex_AD8_01”,
“Mary_CD3_03”,
“John_DD2_01”,
“Daniel_AD8_04”
];
变量filterArray=['AD8','CD3','DD2','PD0'];
数组到排序。排序(函数(a,b){
a_token=a.substr(a.indexOf(“”“)+1);//删除名称部分,因为它是无用的
b_token=b.substr(b.indexOf(“”“)+1);//删除名称部分,因为它是无用的
如果(a_-token.substr(0,3)=b_-token.substr(0,3)){//如果代码相同,则按以下数字排序
如果(a_令牌>b_令牌){return 1;}
if(a_令牌filterArray.indexOf(b_-token.substr(0,3)){return 1;}
if(filterArray.indexOf(a_-token.substr(0,3))
我的解决方案。
此解决方案的唯一限制是必须已经对排序数组进行排序。XXn\u nn
部分可以位于字符串中的任何位置,但它假定nn
部分始终位于XXn
部分之后(如DD3\u 17
)
var result=new Array();
var p,x;
//循环“搜索”数组
对于(var si=0,sl=sort.length;si是排序数组filterary
本身故意按字母顺序排列,还是仅仅是巧合?@Alnitak这个数组['AD8','CD3','DD2','PD0']是故意排序的。@Jack和后缀的格式总是\u XXN\u NN
?@Alnitak是的,如果我的怀疑是正确的,我会更新问题。你这样做太难了!:)对不起,我不得不说字符串会很长。我想OP会先对b进行排序,然后再对a进行排序。看看Alex是如何进行排序的Natasha@Sphaso这很好,因为它在01
和PO
上进行排序。虽然结尾的额外位需要一些工作!Alex和Natasha都在AD8组中,Alex在Natasha之前,因为数字是1。@Sphaso它们是根据每组的数字排序的。
var result=new Array();
var p,x;
//loop the 'search' array
for(var si=0,sl=sort.length;si<sl;si++){
//create new tmp array
var tmp=new Array();
//loop the data array
for(var ai=0,al=arr.length;ai<al;ai++){
var el=arr[ai];
//test if element still exists
if(typeof el=='undefined' || el=='')continue;
//test if element has 'XXn_nn' part
if(arr[ai].indexOf(sort[si]) > -1){
//we don't now where the 'XXn_nn' part is, so we split on '_' and look for it
x=el.split('_');
p=x.indexOf(sort[si]);
//add element to tmp array on position nn
tmp[parseInt(x[p+1])]=el;
//remove element from ariginal array, making sure we don't check it again
arr.splice(ai,1);ai--;
}
}
//remove empty's from tmp array
tmp=tmp.filter(function(n){return n!=undefined});
//add to result array
result=result.concat(tmp);
}