2012-03-09 7 views
2

javascriptで配列を並べ替える方法を "提案された"順序にするための良い方法を考え出したいと思います。配列を優先順位順に並べ替える

だから私の最初の配列は、このようなものに見えると言う:その後

['jim','steve','david'] 

を、私がしたい:ソートされた結果がこの順に開始することで、今、すべて私が気に

['bob','david','steve','darrel','jim'] 

を残りの値は元の順序で表示されます。

だから私は結果があることを期待する:

['jim','steve','david','bob','darrel'] 

私は私が通信していますAPIを持っている、と私は上部のリストでは私にとって重要な結果を提示したいです。その後、私は彼らが元の順序で返されることを好むだろう。

これはjQueryのようなjavascriptフレームワークで簡単に行うことができれば、私もそれについて聞きたいと思います。ありがとう!明確にするため

編集:

私はソートする配列で提供される値は保証されていないことを前提としたいと思います。

['bob','steve','darrel','jim'] 

そして私はでそれをソートしたかった:

だから、元の例では、提供されている場合はだった 'ダビデは' 提供の配列ではありませんので

['jim','steve','david'] 

、Iそれを除外する結果が好きです。

より明確にするためEDIT2: 私が達成しようとしているものの実用的な例:私はをユーザに提示したいと思い

['Load Average','Memory Usage','Disk Space'] 

のようなAPIを見て何かを返します。最も重要な結果が最初に表示されますが、これらのフィールドのそれぞれが返されるとは限りません。だから私は最も重要なもの(他のコードではユーザが決めたもの)を利用可能な場合には最初に表示したいと考えています。

+0

は、元の配列の静的ですか?または、他の場所から来て、ダイナミックになる可能性がありますか? –

+0

APIから来ているので、値は保証されません。配列を参照したい場合でも、提供されていない値が含まれている可能性があります。 – GoldenNewby

+0

しかし、あなたが始める必要がある値は常に '['jim'、 'steve'、 'david']'であると仮定するのは安全でしょうか? –

答えて

2

このような何か作業をする必要があります:

var presetOrder = ['jim','steve','david']; // needn't be hardcoded 

function sortSpecial(arr) { 
    var result = [], 
     i, j; 
    for (i = 0; i < presetOrder.length; i++) 
     while (-1 != (j = $.inArray(presetOrder[i], arr))) 
     result.push(arr.splice(j, 1)[0]); 
    return result.concat(arr); 
} 

var sorted = sortSpecial(['bob','david','steve','darrel','jim']); 

を私が処理されている配列に複数回登場する「特別な」値に許可され、重複がある限り、彼らがシャッフルしているとして保持する必要があることを仮定しましたpresetOrderで定義された順番で前面に表示されます。

注:私はArray.indexOf()ではなく、jQuery's $.inArray()を使用しました。なぜなら、後者はIE9までIEでサポートされておらず、あなたの質問に「jQuery」というタグが付いていたからです。古いIEを気にしない場合、またはshimを使用している場合はもちろん、.indexOf()を使用できます。

+0

これは私が欲しかったのとまったく同じように機能しました。私の例より明らかに複雑な状況を実際に使っています。しかし、私は "presetOrder"を受け入れるように関数を変更しました。 – GoldenNewby

+0

+1は簡単です! – PraveenLearnsEveryday

0

Underscore.jsとお考えですか?このようなリストを操作するためのユーティリティがいくつか含まれています。あなたのケースでは

、あなたはできます

  1. あなたはfilter()を使用して必要な結果をフィルタリングして、コレクションに格納します。

    var priorities = _.filter(['bob','david','steve','darrel','jim'], function(pName){ if (pName == 'jim' || pName == 'steve' || pName == 'david') return true; });

  2. 前のステップからの配列はunion()

    var finalList = _.union(priorities, leftovers);

を使用して連合 without()

var leftovers = _.without(['bob','david','steve','darrel','jim'], 'jim', 'steve', 'david');

  • を使用して他の結果のコピーを取得

  • 0

    http://tinysort.sjeiti.com/

    私はこれが役立つかもしれないと思います。 $('#yrDiv').tsort({place:'start'});は重要なリストを最初に追加します。

    この機能を使用して、好きなようにソートすることもできます。

    0
    var important_results = { 
        // object keys are the important results, values is their order 
        jim: 1, 
        steve: 2, 
        david: 3 
        }; 
    
    // results is the orig array from the api 
    results.sort(function(a,b) { 
        // If compareFunction(a, b) is less than 0, sort a to a lower index than b. 
        // See https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/sort 
        var important_a = important_results[a], 
         important_b = important_results[b], 
         ret; 
    
        if (important_a && !important_b) {ret = -1} 
        else if (important_b && !important_a) {ret = 1} 
        else if (important_a && important_b) {ret = important_a - important_b} 
        else {ret = 0}; // keep original order if neither a or b is important 
    
        return(ret); 
        } 
    ) 
    

    特別に以前から知られている重要な結果を扱うソート機能を使用してください - 結果中に存在する場合、結果の先頭にそれらをソートします。 important_resultsで

    • 項目の結果
    0

    である必要はありませんここでは、簡単なテストページです:

    <html> 
    <head> 
    <script language="javascript"> 
    function test() 
    { 
        var items = ['bob', 'david', 'steve', 'darrel', 'jim']; 
    
        items.sort(function(a,b) 
         { 
          var map = {'jim':-3,'steve':-2,'david':-1}; 
          return map[a] - map[b]; 
         }); 
        alert(items.join(',')); 
    } 
    </script> 
    </head> 
    <body> 
    <button onclick="javascript:test()">Click Me</button> 
    </body> 
    </html> 
    

    通常のjavascript が何であるかを使用していますので、それはほとんどのブラウザで動作しますstable sort algorithmと呼ばれ、元の注文に相当するアイテムを保存することが定義されています。しかし、私は例外があることを知っています。残りの各アイテムの配列インデックスをa1/b1値として使用することで、安定性が保証されます。

    +0

    回答の編集前のバージョンが好きでしたが、私は新しいバージョンを理解していません:a1/b1値でアイテムインデックスを使用していると述べましたが、 '.sort ) 'コールバック? (多くの場合、 'NaN'を返さないのですか?) – nnnnnn

    +0

    @nnnnnn今はNaNを返しません:' undefined'となり、 'undefined'は' 0'として扱われます。減算操作のために。他の部分では、使用するソートアルゴリズムが保証されていないため、ソート前にコードを追加して配列を検索し、マップ内の各アイテムの位置を設定します。 –

    +0

    私はあなたの関数のコンテキストでは動作しませんが、 'undefined-undefined'は' NaN'を返さないと言っていませんか? (IEで間違いなく、私はそれを試しました。) – nnnnnn

    0

    ライブデモ(jsfiddleがダウンしているようだ)

    http://jsbin.com/eteniz/edit#javascript,html

    var priorities=['jim','steve','david']; 
    
    var liveData=['bob','david','steve','darrel','jim']; 
    
    
    var output=[],temp=[]; 
    for (i=0; i<liveData.length; i++){ 
        if($.inArray(liveData[i], priorities) ==-1){ 
         output.push(liveData[i]); 
        }else{ 
         temp.push(liveData[i]); 
        } 
    } 
    var temp2=$.grep(priorities, function(name,i){ 
         return $.inArray(name, temp) >-1;        
    }); 
    
    output=$.merge(temp2, output); 
    
    関連する問題