[英]Sort array of objects by multiple properties in Javascript
我整天都在閱讀類似的帖子,但不知道如何按多個屬性對我的 javascript 數組進行排序。 我的數組有一個“名稱”和“類型”屬性。 要按名稱排序,我現在使用:
byNameDesc.sort(function (a, b) {
var x = a.name.toLowerCase();
var y = b.name.toLowerCase();
return y < x ? -1 : y > x ? 1 : 0;
});
效果很好。 我想增強這個功能。 如果 'name' 是 'foo' 它應該總是在頂部。 而且我還想按“類型”排序。 所以'foo'應該總是在最前面,然后按'name'和'type'排序。
我試過這個:
byNameDefault.sort(function (a, b) {
if (a.name == 'foo') {
return -1;
}
var x = a.type.toLowerCase();
var y = b.type.toLowerCase();
return x < y ? -1 : x > y ? 1 : 0;
});
但這沒有用。
而且我不知道如何按“名稱”和“類型”排序。
任何幫助深表感謝。
對於多個排序標准,您從第一個標准繼續到最后一個標准:如果一個標准的兩個條目不相等,您可以從排序函數返回結果為 -1 或 1。此外,在最后一個標准中,您還可以返回 0兩個相等的輸入。
這是您的案例的示例實現:
byNameDefault.sort(function (a, b) {
// compare names
var na = a.name.toLowerCase();
var nb = b.name.toLowerCase();
if (na !== nb) {
if (na === 'foo')
return -1;
else if (nb === 'foo')
return 1;
else
return na < nb ? -1 : 1;
}
// compare types
return a.type < b.type ? -1 : a.type > b.type ? 1 : 0;
}
在一個表達式中執行此操作,其中不同的組件用||
組合。 ; 只有當一個部分評估為 0 時,下一個才會起作用:
byNameDefault.sort(function (a, b) {
return (b === 'foo') - (a == 'foo') ||
a.name.localeCompare(b.name) ||
a.type.localeCommpare(b.type);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.