2017-08-01 8 views
1

のは、私は文字列の配列を持っているとしましょう:角度2カスタムアルファベット順のパイプはソート

this.data = [ 'cupcake', 'donut', 'eclair', 'froyo', 'gingerbread', 'icecream', 'lollipop', 'marshmallow', 'nougat', 'oreo' ] 

私はアルファベット順にパイプを使用して、これらを並べ替えることができます。

@Pipe({ 
name: 'alphabeticPipe' 
}) 

export class AlphabeticPipe implements PipeTransform { 
transform(data: any[], searchTerm: string): any[] { 
    data.sort((a: any, b: any) => { 
    if (a < b) { 
    return -1; 
    } else if (a > b) { 
    return 1; 
    } else { 
    return 0; 
    } 
}); 
return data; 
} 
} 

私の質問はどのように私はこれらを並べ替えることができていますカスタムアルファベット順、例えば「e」が最初に表示され、次に「g」、「m」などが表示されますので、注文は次のようになります:eclair、gingerbread、marshmallow、その他はアルファベット順?

ありがとうございました!

答えて

3

それを表現する良い方法を理解するために私はしばらく時間をかけました。この実装でeaの前に常にあるので、eeea

var data = [ 'cupcake', 'donut', 'eclair', 'froyo', 'gingerbread', 'icecream', 'lollipop', 'marshmallow', 'nougat', 'oreo' ] 
 

 
data.sort(function(a, b) { 
 
    var i = 0; 
 
    
 
    while (true) { 
 
    if (i > a.length && i > b.length) return 0; 
 
    else if (i > a.length) return -1; 
 
    else if (i > b.length) return 1; 
 
    else { 
 
     var compare = compareChar(a.charAt(i), b.charAt(i)); 
 
     if (compare != 0) return compare; 
 
     i++; 
 
    } 
 
    } 
 

 
    function compareChar(a, b) { 
 
    var special = ["e", "g", "m"]; 
 
    
 
    var ia = special.indexOf(a); 
 
    var ib = special.indexOf(b); 
 

 
    if (ia != -1 && ib != -1) { // both special char 
 
     return (ia == ib) ? 0 : (ia < ib) ? -1 : 1; 
 
    } 
 
    else if (ia != -1 && ib == -1) { 
 
     return -1; 
 
    } 
 
    else if (ia == -1 && ib != -1) { 
 
     return 1; 
 
    } 
 
    else { 
 
     return (a == b) ? 0 : (a < b) ? -1 : 1; 
 
    } 
 
    } 
 
}); 
 

 
document.body.innerHTML = data.toString();

の前にソートされていることを

注意