2017-05-18 9 views
2

jqueryの中で優先順位で並べ替えるか、JS

var data = [{ 
 
    "type": "local", 
 
    "name": "Frank", 
 
    "age": 89 
 
}, { 
 
    "type": "visitor", 
 
    "name": "Mary", 
 
    "age": 76 
 
}, { 
 
    "type": "local", 
 
    "name": "John", 
 
    "age": 36 
 
}, { 
 
    "type": "visitor", 
 
    "name": "James", 
 
    "age": 10 
 
}, { 
 
    "type": "local", 
 
    "name": "Lily", 
 
    "age": 17 
 
}, { 
 
    "type": "visitor", 
 
    "name": "Harry", 
 
    "age": 67 
 
}, { 
 
    "type": "local", 
 
    "name": "Larry", 
 
    "age": 7 
 
}, { 
 
    "type": "visitor", 
 
    "name": "Harold", 
 
    "age": 37 
 
}] 
 

 
var sort_by = function(field, reverse, primer) { 
 

 
    var key = primer ? 
 
    function(x) { 
 
     return primer(x[field]) 
 
    } : 
 
    function(x) { 
 
     return x[field] 
 
    }; 
 

 
    reverse = !reverse ? 1 : -1; 
 

 
    return function(a, b) { 
 
    return a = key(a), b = key(b), reverse * ((a > b) - (b > a)); 
 
    } 
 
} 
 

 

 
data = data.sort(sort_by('age', true, parseFloat)); 
 
console.log(JSON.stringify(data))

。現在は、年齢を年齢順に並べ替えています。それはそれなりにうまくいっています。私はソートでこのソートを見つけました。

私はプロセスに別の要件を追加したいと思います。私はまず、すべてのタイプをローカルで並べ替えることができるようにしたいと思っていますすべてのローカル最初に古いものから最も若いものへ次にすべてのローカルを並べ替えた後に残りのものを古いものから最も若いものに並べ替えます。

UPDATE

あります別のタイプがあるが、私は必要なのは、まず最初のリスト内でのすべてをローカルにすることですが、まだ最古に最年少にして、残りは最古にまだあるので、それはここで問題doesntの最も若い。

+0

使用 'フィルタ()' 'ソート()'を呼び出す前に:あなたはどのように 'data.filter(D => d.type == 'ローカル')をソート(...' –

+0

。並べ替え順序を昇順に変更したいのですが、地元住人も先に来るべきでしょうか? –

+0

@RoryMcCrossanもし私が他のタイプを削除したフィルタを使用した場合、私はほんの一番古いものから最も若いものまでリストを作成したいと思っています。残りは最も古いものから最も若いものになります – Giant

答えて

4

type'local'に等しいかどうかを確認する必要があります。次に項目を上に移動する必要があります。これは、比較と比較のデルタによって行われます。例

        cb-ca 
    a  b check a check b result comment 
----- ----- ------- ------- ------ ------------------ 
local local  true  true  0 take b.age - a.age 
local other  true false  -1 move a to top 
other local false  true  1 move a to bottom 
other other false false  0 take b.age - a.age 
data.sort(function (a, b) { 
    return (b.type === 'local') - (a.type === 'local') || b.age - a.age; 
}); 

var data = [{ type: "local", name: "Frank", age: 89 }, { type: "visitor", name: "Mary", age: 76 }, { type: "local", name: "John", age: 36 }, { type: "visitor", name: "James", age: 10 }, { type: "local", name: "Lily", age: 17 }, { type: "visitor", name: "Harry", age: 67 }, { type: "local", name: "Larry", age: 7 }, { type: "visitor", name: "Harold", age: 37 }], 
 
    sort_by = function(field, reverse, primer) { 
 
     var key = primer ? 
 
       function(x) { return primer(x[field]); } : 
 
       function(x) { return x[field]; }; 
 

 
     reverse = !reverse ? 1 : -1; 
 

 
     return function(a, b) { 
 
      return (b.type === 'local') - (a.type === 'local') || reverse * (key(a) - key(b)); 
 
     }; 
 
    }; 
 

 
data.sort(sort_by('age', true, parseFloat)); 
 
console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

私は何をしたいのですか最初に行くにはすべて地元ですが、最も古いものから最も若いものまで、そして残りはまだ若いものから最も古いものまであります。一番若い時から一番若い時まで – Giant

+0

あなたはコードを完全に変更してから何をしたのか理解できるようにビット説明を追加できますか?それは私と他の読者に役立つでしょう – Giant

+0

私はまだ理解できませんが私は答えとしてそれをチェックします – Giant

0

については

私はそれがダムのようなものに見えます知っているが、それは私のために[OK]を動作します...

https://jsfiddle.net/wuhduhren/vcyvwq4k/5/

function sort(data){ 
    var personNotLocal = []; 
    var sortedData = []; 
    var sortedCleanData = []; 

    for (var i = 0; i < data.length; i++) { 
     var personalData = data[i]; 
    if (personalData["type"] == 'local'){ 
     sortedData.push([personalData['age'], personalData]); 
     sortedData.sort(function(a,b){return a[1] - b[1]}); //sort by age 
    } else { 
     personNotLocal.push([personalData['age'], personalData]); 
     personNotLocal.sort(function(a,b){return a[1] - b[1]}); //sort by age 
    } 
    } 
    sortedData.push.apply(sortedData, personNotLocal); //append personNotLocal array after sortedData 

    for (var i = 0; i < sortedData.length; i++) { 
    sortedCleanData.push(sortedData[i][1]); 
    } 
    return sortedCleanData; 
} 

var data = [{ 
    "type": "local", 
    "name": "Frank", 
    "age": 89 
}, { 
    "type": "visitor", 
    "name": "Mary", 
    "age": 76 
}, { 
    "type": "local", 
    "name": "John", 
    "age": 36 
}, { 
    "type": "visitor", 
    "name": "James", 
    "age": 10 
}, { 
    "type": "local", 
    "name": "Lily", 
    "age": 17 
}, { 
    "type": "visitor", 
    "name": "Harry", 
    "age": 67 
}, { 
    "type": "local", 
    "name": "Larry", 
    "age": 7 
}, { 
    "type": "visitor", 
    "name": "Harold", 
    "age": 37 
}]; 


console.log(JSON.stringify(sort(data), null, 2)); 
関連する問題