簡體   English   中英

JavaScript排序數組由2個值組成

[英]JavaScript sort array by 2 values

我有一個數組,我想按“id”和“date”從小到大排序。 我該怎么做才能正確?

示例:

var unsorted = [
    {id: 1, date: "2015-01-18T15:00:00+01:00"}, 
    {id: 1, date: "2015-01-18T14:30:00+01:00"}, 
    {id: 2, date: "2015-01-18T10:00:00+01:00"}, 
    {id: 1, date: "2015-01-18T16:00:00+01:00"}, 
    {id: 3, date: "2015-01-18T14:15:00+01:00"}, 
    {id: 2, date: "2015-01-18T14:00:00+01:00"}
]

應該返回:

var sorted = [
    {id: 1, date: "2015-01-18T14:30:00+01:00"}, 
    {id: 1, date: "2015-01-18T15:00:00+01:00"}, 
    {id: 1, date: "2015-01-18T16:00:00+01:00"}, 
    {id: 2, date: "2015-01-18T10:00:00+01:00"}, 
    {id: 2, date: "2015-01-18T14:00:00+01:00"},
    {id: 3, date: "2015-01-18T14:15:00+01:00"} 
]

以下是使用array.sort的示例:

 var arr = [ {id: 1, date: "2015-01-18T15:00:00+01:00"}, {id: 1, date: "2015-01-18T14:30:00+01:00"}, {id: 2, date: "2015-01-18T10:00:00+01:00"}, {id: 1, date: "2015-01-18T16:00:00+01:00"}, {id: 3, date: "2015-01-18T14:15:00+01:00"}, {id: 2, date: "2015-01-18T14:00:00+01:00"} ]; arr.sort(function(a,b){ if (a.id == b.id) return a.date.localeCompare(b.date); return a.id-b.id; }); // test for (var i in arr) { console.log(arr[i]); } 

結果是:

 Object {id: 1, date: "2015-01-18T14:30:00+01:00"}
 Object {id: 1, date: "2015-01-18T15:00:00+01:00"}
 Object {id: 1, date: "2015-01-18T16:00:00+01:00"}
 Object {id: 2, date: "2015-01-18T10:00:00+01:00"}
 Object {id: 2, date: "2015-01-18T14:00:00+01:00"}
 Object {id: 3, date: "2015-01-18T14:15:00+01:00"}

你可以使用.sort()

var unsorted = [
    {id: 1, date: "2015-01-18T15:00:00+01:00"}, 
    {id: 1, date: "2015-01-18T14:30:00+01:00"}, 
    {id: 2, date: "2015-01-18T10:00:00+01:00"}, 
    {id: 1, date: "2015-01-18T16:00:00+01:00"}, 
    {id: 3, date: "2015-01-18T14:15:00+01:00"}, 
    {id: 2, date: "2015-01-18T14:00:00+01:00"}
];

var sorted = unsorted.sort(function(a, b) {
    return a.id == b.id ?
        new Date(a.date) - new Date(b.date) : a.id - b.id;
});

console.log(sorted);

輸出:

[ { id: 1, date: '2015-01-18T14:30:00+01:00' },
  { id: 1, date: '2015-01-18T15:00:00+01:00' },
  { id: 1, date: '2015-01-18T16:00:00+01:00' },
  { id: 2, date: '2015-01-18T10:00:00+01:00' },
  { id: 2, date: '2015-01-18T14:00:00+01:00' },
  { id: 3, date: '2015-01-18T14:15:00+01:00' } ]

試一試

var sorted = unsorted.sort(function(a, b) {
    return a.id === b.id ?
      Date.parse(a.date) - Date.parse(b.date) :
      a.id - b.id ;
});

說明

如果id字段相等,我們想要返回date字段的比較。

如果id字段不相等,我們將返回id字段的比較

Array.sort采用帶有兩個參數的函數來比較數組的兩個元素。 如果此函數返回負數,則a放在b之前,如果它返回正數,則a放在b之前,如果它返回0,則它們保持不變。 在這里,我通過id比較它們,如果它們的ID相同,那么我按日期比較它們。

 var unsorted = [{ id: 1, date: "2015-01-18T15:00:00+01:00" }, { id: 1, date: "2015-01-18T14:30:00+01:00" }, { id: 2, date: "2015-01-18T10:00:00+01:00" }, { id: 1, date: "2015-01-18T16:00:00+01:00" }, { id: 3, date: "2015-01-18T14:15:00+01:00" }, { id: 2, date: "2015-01-18T14:00:00+01:00" }]; unsorted.sort(function(a, b) { if (a.id < b.id) return -1; else if (a.id > b.id) return 1; else { if (a.date < b.date) return -1; else if (a.date > b.date) return 1; else return 0; } }); 

分而治之!

首先將輸入數組縮減為id => object的映射,即:

 var dataById = unsorted.reduce(function (soFar, value) { // Initialise the array if we haven't processed this // id yet. if (soFar[value.id] === undefined) { soFar[value.id] = []; } // ad this object to Array. soFar[value.id].push(value); return soFar; }, {}); 

現在,您可以通過循環對象的鍵對每個數組進行排序,請注意,這會修改dataById映射。

 Object.keys(dataById).forEach(function (id) { dataById[id] = dataById[id].sort(); }); 

最后,您可以將所有數據組合在一起,再次迭代地圖中的鍵。 請注意,javascript中的地圖(對象)不保證其鍵的順序,因此您可能希望在迭代之前首先將ID轉儲到數組:

 var ids = Object.keys(dataById).sort(); // Reduce the ids into an Array of data. var ids.reduce(function (soFar, value) { return soFar.concat(dataById[id]); }, []); 

不是解決問題的最有效方法,但希望它能為您提供一些思考過程的幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM