我有一個這樣的物件陣列:
// dishes: [
{category: 'LEGUME', description: 'A'},
{category: 'VEGETABLE', description: 'N'},
{category: 'VEGETABLE', description: 'B'},
{category: 'VEGETABLE', description: 'A'},
{category: 'FISH', description: 'C'},
{category: 'LEGUME', description: 'E'},
{category: 'LEGUME', description: 'B'},
{category: 'LEGUME', description: 'N'},
]
我用這個函式對這個陣列進行排序:
const dishes = dishes.sort((a, b) => {
if (a.category > b.category) return -1;
if (a.category < b.category) return 1;
return a.description.localeCompare(b.description);
});
上面的輸出是這樣的:
// dishes: [
{category: 'LEGUME', description: 'A'},
{category: 'LEGUME', description: 'B'},
{category: 'LEGUME', description: 'E'},
{category: 'LEGUME', description: 'N'},
{category: 'VEGETABLE', description: 'A'},
{category: 'VEGETABLE', description: 'B'},
{category: 'VEGETABLE', description: 'N'},
{category: 'FISH', description: 'C'},
]
但是現在我想強制其中一個類別成為第一個類別,比如說蔬菜,所以輸出應該是:
// dishes: [
{category: 'VEGETABLE', description: 'A'},
{category: 'VEGETABLE', description: 'B'},
{category: 'VEGETABLE', description: 'N'},
{category: 'LEGUME', description: 'A'},
{category: 'LEGUME', description: 'B'},
{category: 'LEGUME', description: 'E'},
{category: 'LEGUME', description: 'N'},
{category: 'FISH', description: 'C'},
]
我已經嘗試了其他問題的一堆解決方案,但都沒有奏效,有什么建議嗎?可能嗎?
提前致謝。
[更新]:我的最終解決方案,感謝@Andrew Parks:
dishes.sort((a, b) =>
(b.category === "VEGETABLE") -
(a.category === "VEGETABLE") ||
a.category.localeCompare(b.category) ||
a.description.localeCompare(b.description)
);
uj5u.com熱心網友回復:
最簡潔的方法是這樣的:
const dishes = [
{category: 'LEGUME', description: 'A'},
{category: 'VEGETABLE', description: 'B'},
{category: 'FISH', description: 'C'},
{category: 'LEGUME', description: 'E'},
{category: 'LEGUME', description: 'B'},
{category: 'LEGUME', description: 'N'},
];
const cmp = (a,b,c) => a[c].localeCompare(b[c]);
const cmpEq = (a,b,c,d) => (b[c]===d) - (a[c]===d);
dishes.sort((a,b) =>
cmpEq(a,b, 'category', 'VEGETABLE') ||
cmp(a,b, 'category') ||
cmp(a,b, 'description')
);
console.log(dishes);
如果您希望任何排序以相反的順序排列,只需在 . 前面放一個減號即可cmp()。
uj5u.com熱心網友回復:
排序時可以同時連接類別和描述,如下:
const dishes = [
{category: 'LEGUME', description: 'A'},
{category: 'VEGETABLE', description: 'B'},
{category: 'VEGETABLE', description: 'A'},
{category: 'VEGETABLE', description: 'N'},
{category: 'FISH', description: 'C'},
{category: 'LEGUME', description: 'E'},
{category: 'LEGUME', description: 'B'},
{category: 'LEGUME', description: 'N'}
]
dishes.sort((a, b) => {
if (a.category === 'VEGETABLE') return -1
if (b.category === 'VEGETABLE') return 1
return `${a.category}${a.description}`.localeCompare(`${b.category}${b.description}`);
});
console.log(dishes)
.as-console-wrapper { max-height:100% !important; top 0; }
uj5u.com熱心網友回復:
VEGETABLE您可以對函式中的值進行特殊處理sort:
const dishes = [
{category: 'LEGUME', description: 'A'},
{category: 'VEGETABLE', description: 'B'},
{category: 'VEGETABLE', description: 'A'},
{category: 'VEGETABLE', description: 'N'},
{category: 'FISH', description: 'C'},
{category: 'LEGUME', description: 'E'},
{category: 'LEGUME', description: 'B'},
{category: 'LEGUME', description: 'N'}
]
dishes.sort((a, b) => {
res = (b.category == 'VEGETABLE') - (a.category == 'VEGETABLE')
if (res) return res
res = a.category.localeCompare(b.category)
if (res) return res
return a.description.localeCompare(b.description);
});
console.log(dishes)
.as-console-wrapper { max-height:100% !important; top 0; }
請注意,sort對陣列進行就地排序,因此您無需從中分配結果。
uj5u.com熱心網友回復:
首先比較專案是否屬于的差異VEGETABLE- 僅當結果為 0 時才繼續執行排序功能的其余部分。
const dishes = [
{category: 'LEGUME', description: 'A'},
{category: 'VEGETABLE', description: 'B'},
{category: 'VEGETABLE', description: 'A'},
{category: 'VEGETABLE', description: 'N'},
{category: 'FISH', description: 'C'},
{category: 'LEGUME', description: 'E'},
{category: 'LEGUME', description: 'B'},
{category: 'LEGUME', description: 'N'},
];
dishes.sort((a, b) => {
const vegResult = a.category === 'VEGETABLE' - b.category === 'VEGETABLE';
if (vegResult) return vegResult;
if (a.category > b.category) return -1;
if (a.category < b.category) return 1;
return a.description.localeCompare(b.description);
});
console.log(dishes);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/514795.html
