2017-10-26 5 views
2

以内に、私はそうのような項目の配列を持っている:Javascriptのカスタムソート、グループ特定の項目下部にソートJavaScriptで

[ 
    'title', 
    'firstname', 
    'company', 
    '[m]usr_phone' 
    '[m]usr_city' 
] 

私はすべてのように、カスタム列のソート機能を使用して、これを並べ替えるしたいと思います[m]以外のアイテムはすべてソートされ、すべての[m]アイテムはソートされ、ボトムにプッシュされます。

これを達成するために、

function(a, b) { 
      if (!a.indexOf('[m]') && b.indexOf('[m]') === 0 
       || a.indexOf('[m]') && b.indexOf('[m]')) { 
        return -1; 
      } 

      if (a.indexOf('[m]') === 0 && !b.indexOf('[m]')) { 
       return 1; 
      } 

      return 0; 
     } 

しかし、それが正しく働くようにすることはできませんでした。出力は次のようになります:

[ 
    'company', 
    'firstname', 
    'title', 
    '[m]usr_city' 
    '[m]usr_phone' 
] 

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

答えて

2

あなたはにより、後でソートプレフィックスをチェックして、可能性があります。

var array = ['title', 'firstname', 'company', '[m]usr_phone', '[m]usr_city']; 
 

 
array.sort(function (a, b) { 
 
    return (a.slice(0, 3) === '[m]') - (b.slice(0, 3) === '[m]') || a.localeCompare(b); 
 
}); 
 

 
console.log(array);

+0

と思う(https://stackoverflow.com/q/14677060/1048572)[あなたは*ロケール*の比較を必要としない場合は、 'localeCompare'を使うべきではありません] 。 – Bergi

+0

答えとしてこれを受け入れる、素晴らしい作品です。ロカールについての興味深いメモ。私はリストが小さく(20項目以上)小さいので騒がしいことはないが、リストがかなり成長したらパフォーマンスが問題になるかもしれない。あなたはここでそれを見ることができます。https://jsperf.com/operator-vs-localecompage/3 –

+0

jsfiddle:https://jsfiddle.net/devsi/5x03s9h8/1/ –

0

あなたは(すなわち、いずれか[m]かで始まる)同じ「クラス」の項目を同じように比較するので、これを行うにはa.startsWith("[m]") == b.startsWith("[m]")を使用して、を使用します。

console.log([ 
 
    "company", 
 
    "firstname", 
 
    "title", 
 
    "[m]usr_phone", 
 
    "[m]usr_city" 
 
].sort((a, b) => { 
 
    if (a.startsWith("[m]") == b.startsWith("[m]")) { 
 
    return a.localeCompare(b); 
 
    } else { 
 
    return (a.startsWith("[m]") ? 
 
     1 : 
 
     -1); 
 
    } 
 
}));

関連する問題