[英]Array sorting alphabetically within another value sort in Javascript
也許我以錯誤的方式提出了這個問題,但無法從互聯網上找到答案。
我有一組可以按各種值(例如職位,部門)排序的員工。
有許多具有相同價值觀的員工(例如,許多調酒師或許多從事賓客服務的人)。
因此,我需要將這些子組(所有調酒師或所有來賓服務人員或其他任何人員)按姓氏進行字母排序(理想情況下,然后是具有相同姓氏的組,再按名字進行排序)。
這是我目前的樣子:
const sorted = state.employees.sort(function(a, b) {
if (a[filterValue] === b[filterValue]) {
let alphaA = a.lastName, alphaB = b.lastName;
return alphaA < alphaB ? -1 : alphaA > alphaB ? 1 : 0;
}
return a[filterValue] > b[filterValue] ? 1 : -1;
});
但是,返回的數組會混合在一起,並在每次單擊時返回不同的順序,如下所示:
而且沒有實現asc / desc邏輯,因此,從理論上講,多次單擊應返回相同的排序數組,而不是以不同的順序返回一個數組。
大概是因為按字母順序進行的比較並沒有比較整個匹配值組(全部在住宿部門),而是僅比較立即值,但是我不確定這是問題所在,並且完全不確定如何解決。
對於完成任務非常有幫助,但是對解釋非常感謝,因為我顯然不完全了解排序的工作原理。
非常感謝!
您可以考慮使用諸如thenBy之類的預先存在的庫,而不是設計自己的比較器函數。 它允許您使用如下符號對多個屬性進行排序:
state.employees.sort(firstBy('position').thenBy('lastName').thenBy('firstName'));
顯然,您必須根據需要使用它,並相應地重置排序,但這應該使您不必實現自己的版本
var filterValue = 'department' // using a dummy one for now
state.employees.sort(function(a, b){
if (a[filterValue] > b[filterValue]) return 1;
if (a[filterValue] < b[filterValue]) return -1;
//check your filters
if (a.lastname < b.lastname ) return -1;
if (a.lastname > b.lastname ) return 1;
//then check their last names
if (a.firstname < b.firstname ) return -1;
if (a.firstname > b.firstname ) return 1;
//then check their first names
return 0;
});
這是我的演示: https : //jsfiddle.net/zjhs20vz/
這是假設我正確回答了您的問題。 在排序過濾器的邏輯漏斗的基礎上進行排序是很有意義的,如果它們相等,則是姓氏,然后是名字
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.