2 つのプロパティで並べ替えたいオブジェクトの配列があります。
- ReminderTimestamp
- ModificationTimestamp
並べ替え順: 降順
このオブジェクトを 1 つのプロパティで並べ替えることは問題ではありませんが、この場合、それを機能させる方法がわかりません。
2 つのプロパティで並べ替えたいオブジェクトの配列があります。
並べ替え順: 降順
このオブジェクトを 1 つのプロパティで並べ替えることは問題ではありませんが、この場合、それを機能させる方法がわかりません。
タイムスタンプ自体が正常にソートされていると仮定して (たとえば、ISO8601 と同じタイムゾーン)、試してください:
myArray.sort(function(a,b) {
var x = a.RemindingTimestamp - b.RemindingTimestamp;
return x == 0? a.ModificationTimestamp - b.ModificationTimestamp : x;
}
降順の並べ替えは、減算の順序を変更するか、結果に -1 を掛けることによって実現されます。減算しないためにソートされない日付 (例: 2012-04-12) は、最初に日付に変換することで処理できます。
// Convert ISO8601 date string to date object
// Assuming date is ISO8601 long format, ignores timezone
function toDate(s) {
var bits = s.split(/[-T :]/);
var d = new Date(bits[0], bits[1]-1, bits[2]);
d.setHours(bits[3], bits[4], parseFloat(bits[5]));
return d;
}
// Source data, should end up sorted per n
var myArray = [
{RemindingTimestamp: '2012-04-15T23:15:12Z',
ModificationTimestamp: '2012-04-15T23:15:12Z', n: 4},
{RemindingTimestamp: '2012-04-12T23:15:12Z',
ModificationTimestamp: '2012-04-12T23:15:12Z', n: 1},
{RemindingTimestamp: '2012-04-12T23:15:12Z',
ModificationTimestamp: '2012-04-13T23:15:12Z', n: 2},
{RemindingTimestamp: '2012-04-12T23:15:12Z',
ModificationTimestamp: '2012-04-13T23:15:14Z', n: 3}
];
// Sort it
myArray.sort(function(a,b) {
var x = toDate(a.RemindingTimestamp) - toDate(b.RemindingTimestamp);
return x? x : toDate(a.ModificationTimestamp) - toDate(b.ModificationTimestamp);
});
// Just to show the result
function sa(o) {
var result = [], t;
for (var i=0; i<o.length; i++) {
t = o[i];
result.push(t.n);
}
alert(result);
}
sa(myArray); // 1,2,3,4
日付文字列から日付オブジェクトへの変換は、必要に応じてタイム ゾーンを処理するように拡張できます (ISO8601 準拠の文字列の場合のみ、実際のオフセットの代わりにタイム ゾーンの略語を使用するものは信頼できません)。
function compareObject(obj1, obj2){
if(obj1.RemindingTimestamp > obj2.RemindingTimestamp)
return - 1;
if(obj2.RemindingTimestamp > obj1.RemindingTimestamp)
return 1;
// obj1.RemindingTimestamp == obj2.RemindingTimestamp
if(obj1.ModificationTimestamp > obj2.ModificationTimestamp)
return -1;
if(obj2.ModificationTimestamp > obj1.ModificationTimestamp)
return 1;
return 0;
}
myObjects.sort(compareObject);
資力:
カスタム コンパレータは次の形式を取ります。
myArray.sort(function(a,b){
var m1=a1.RemindingTimestamp,
m2=a2.RemindingTimestamp,
n1=a1.ModificationTimestamp,
n2=a2.ModificationTimestamp;
return m1<m2 ? -1 : m1>m2 ? 1 :
n1<n2 ? -1 : n1>n2 ? 1 : 0;
});
降順で並べ替えるには、<
andを入れ替えます>
(または and を入れ替え1
ます-1
)。
これが必要になるたびに独自のカスタムコンパレータを作成できますが、シュワルツ変換を使用して、複数の基準で簡単にソートできるように明示的に設計されたメソッドを作成しました(状況によっては高速ですが、より多くのメモリを消費する場合があります): http:// phrogz.net/js/Array.prototype.sortBy.js
要するに:
myArray.sortBy(function(obj){
return [obj.RemindingTimestamp, obj.ModificationTimestamp];
}).reverse();
降順ソートが必要だと述べたので、reverse
そこにあります。RemindingTimestamp
とが両方ともModificationTimestamp
数値の場合は、次のようにすることもできます。
myArray.sortBy(function(obj){
return [-obj.RemindingTimestamp, -obj.ModificationTimestamp];
});
sortBy
配列に追加するコードは次のとおりです。
(function(){
// Extend Arrays in a safe, non-enumerable way
if (typeof Object.defineProperty === 'function'){
// Guard against IE8's broken defineProperty
try{Object.defineProperty(Array.prototype,'sortBy',{value:sb}); }catch(e){}
}
// Fall back to an enumerable implementation
if (!Array.prototype.sortBy) Array.prototype.sortBy = sb;
function sb(f){
for (var i=this.length;i;){
var o = this[--i];
this[i] = [].concat(f.call(o,o,i),o);
}
this.sort(function(a,b){
for (var i=0,len=a.length;i<len;++i){
if (a[i]!=b[i]) return a[i]<b[i]?-1:1;
}
return 0;
});
for (var i=this.length;i;){
this[--i]=this[i][this[i].length-1];
}
return this;
}
})();
ドキュメントからのいくつかの例を次に示します。
var a=[ {c:"GK",age:37}, {c:"ZK",age:13}, {c:"TK",age:14}, {c:"AK",age:13} ];
a.sortBy( function(){ return this.age } );
--> [ {c:"ZK",age:13}, {c:"AK",age:13}, {c:"TK",age:14}, {c:"GK",age:37} ]
a.sortBy( function(){ return [this.age,this.c] } );
--> [ {c:"AK",age:13}, {c:"ZK",age:13}, {c:"TK",age:14}, {c:"GK",age:37} ]
a.sortBy( function(){ return -this.age } );
--> [ {c:"GK",age:37}, {c:"TK",age:14}, {c:"ZK",age:13}, {c:"AK",age:13} ]
var n=[ 1, 99, 15, "2", "100", 3, 34, "foo", "bar" ];
n.sort();
--> [ 1, "100", 15, "2", 3, 34, 99, "bar", "foo" ]
n.sortBy( function(){ return this*1 } );
--> [ "foo", "bar", 1, "2", 3, 15, 34, 99, "100" ]
n.sortBy( function(o){ return [typeof o,this] } );
--> [1, 3, 15, 34, 99, "100", "2", "bar", "foo"]
n.sortBy(function(o){ return [typeof o, typeof o=="string" ? o.length : o] })
--> [1, 3, 15, 34, 99, "2", "100", "bar", "foo"]
最後の例では、たまたま;(typeof this)
と同じではないことに
注意してください。(typeof o)
詳細については、この投稿を参照してください。
別の方法
function sortBy(ar) {
return ar.sort((a, b) => a.RemindingTimestamp === b.RemindingTimestamp ?
a.ModificationTimestamp.toString().localeCompare(b.ModificationTimestamp) :
a.RemindingTimestamp.toString().localeCompare(b.RemindingTimestamp));
}