2015-09-04 54 views
0

我努力與排序兩個級別。邏輯如下。如果任何對象具有狀態,則返回狀態最近的對象。如果沒有任何對象具有狀態,則返回沒有狀態的最近對象。Javascript排序與兩個屬性

var apps = [ 
    { status: 'PASS', 
    date_created: Thu Sep 03 2015 17:24:45 GMT-0700 (PDT) 
    }, 
    { status: 'FAIL', 
    date_created: Thu Sep 02 2015 17:24:45 GMT-0700 (PDT), 
    }, 
    { status: '', 
    date_created: Thu Sep 03 2015 17:24:45 GMT-0700 (PDT), 
    } 
] 

var desired_result = [{ status: 'PASS', 
    date_created: Thu Sep 03 2015 17:24:45 GMT-0700 (PDT) 
    }] 

var apps_2 = [ 
    { status: '', 
    date_created: Thu Sep 03 2015 17:24:45 GMT-0700 (PDT) 
    }, 
    { status: '', 
    date_created: Thu Sep 02 2015 17:24:45 GMT-0700 (PDT), 
    }, 
    { status: '', 
    date_created: Thu Sep 01 2015 17:24:45 GMT-0700 (PDT), 
    } 
] 

var desired_resul2 = [{ status: '', 
    date_created: Thu Sep 03 2015 17:24:45 GMT-0700 (PDT) 
    }] 

我已經試過

var sorted = _.sort_by(apps, function (x) { x.date_updated }); 

我也看了一些其他SO questions但第一個排序後不能保持的對象到位。

+0

'date_created'是一個字符串嗎?並且沒有這樣的函數稱爲'_.sort_by' – thefourtheye

+0

它是一個日期對象 – user2954587

+0

*如果任何對象具有狀態* - 您能否清楚地解釋它?在您的示例中的所有數據都'status' – thefourtheye

回答

2

如果我正確理解你的問題,這裏是你在找什麼。 http://jsfiddle.net/whxu5sea/3/

您需要過濾元素以確保它們具有任何種類的狀態。然後按日期排序,最早排序。然後獲得第一個值。在我的例子中,我假設字符串的日期,但仍然應該工作。

var apps = [ 
    { status: 'PASS', 
    date_created: 'Thu Sep 03 2015 17:24:45 GMT-0700 (PDT)' 
    }, 
    { status: 'FAIL', 
    date_created: 'Thu Sep 02 2015 17:24:45 GMT-0700 (PDT)', 
    }, 
    { status: '', 
    date_created: 'Thu Sep 01 2015 17:24:45 GMT-0700 (PDT)', 
    } 
]; 

var x; 
var arr = _.filter(apps, function(data) { 
    return !!data.status.length; 
}); 

x = _.chain(arr.length ? arr : apps) 
    .sortBy(function(data) { 
     return new Date(data.date_created).getTime(); 
    }).last().value(); 

console.log(x); 

要檢查是否正常工作沒有提供狀態時:http://jsfiddle.net/whxu5sea/4/

我希望這有助於。 LMK如果需要進一步澄清。

編輯:更新以獲取NEWEST元素(最後)。

+0

顯然,我只看過你的問題的一部分,對不起!在它上面處理這兩種情況。 – sic1

+0

固定以處理這兩種情況。 – sic1

+0

非常接近!它無法按多個狀態的日期排序https://jsfiddle.net/ts6c9sxL/ – user2954587

1

下面是一個簡單的解決方案,只需通過apps進行一次迭代,而不需要篩選步驟。 See here for a jsfiddle

這個概念是,如果status是虛假的,它的日期被轉換成一個負數,在所有虛假元素中保留正確的排序順序,但使所有虛擬元素的排序順序低於所有非虛假元素。

我們通過減去8640000000000001,即(the maximimum millis in a Date加1)來轉換錯誤元素日期。

var x = _.chain(apps).sortBy(function(x) { 
     var date = new Date(x.date_created).getTime(); 
     return x.status ? date : date - 8640000000000001; 
    }).last().value(); 

console.log(x);