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