我有一個物件陣列,并試圖通過優先考慮特定的 id 值并將其分配給陣列的頂部來對陣列進行排序。該陣列是通過 API 回傳的,可以看作是以下資料:
[
{
"id": 310,
"title": "Breast Cancer Screening"
},
{
"id": 315,
"title": "Depression in Adults Screening"
},
{
"id": 322,
"title": "Aspirin Use to Prevent Cardiovascular Disease"
},
{
"id": 329,
"title": "Syphilis Infection in Nonpregnant Adults and Adolescents Screening"
},
{
"id": 337,
"title": "Latent Tuberculosis Infection Screening"
}
]
因此,在我們的例子中,我們想要優先考慮"id": 329并將其移動到陣列的頂部,從而產生以下結果:
[
{
"id": 329,
"title": "Syphilis Infection in Nonpregnant Adults and Adolescents Screening"
},
{
"id": 310,
"title": "Breast Cancer Screening"
},
{
"id": 315,
"title": "Depression in Adults Screening"
},
{
"id": 322,
"title": "Aspirin Use to Prevent Cardiovascular Disease"
},
{
"id": 337,
"title": "Latent Tuberculosis Infection Screening"
}
]
我試圖在下面實作以下功能來完成這種排序和過濾,但是很難讓它作業。任何有關正確方法的幫助或指導來實作這一點將不勝感激!
排序功能
const prioritizeList = (recommendationsList) => {
const prioritizedRecommendations = recommendationsList.specificRecommendations
console.log("initialize prioritizedRecommendations", prioritizedRecommendations)
const prioritizeArray = [
{"id":329}
];
const arrayFiltered = prioritizedRecommendations.filter(item => prioritizeArray.find(i => i.id === item.id))
let newArr = prioritizeArray.concat(arrayFiltered)
}
uj5u.com熱心網友回復:
我會:
- 創建一組優先級 id - 所以不是具有 id 屬性的物件,而是 id 值本身。
- 使用回呼函式
sort
以下是外觀:
const prioritizeList = (recommendationsList) => {
const prioritizedRecommendations = recommendationsList.specificRecommendations;
const prioritizeSet = new Set([329]);
const newArr = prioritizedRecommendations.sort((a, b) =>
prioritizeSet.has(b.id) - prioritizeSet.has(a.id)
);
return newArr; // Note that the original array has been sorted in-place
}
uj5u.com熱心網友回復:
我會這樣做...
一)方法:
const data =
[ { id: 310, title: 'Breast Cancer Screening' }
, { id: 315, title: 'Depression in Adults Screening' }
, { id: 322, title: 'Aspirin Use to Prevent Cardiovascular Disease' }
, { id: 329
, title: 'Syphilis Infection in Nonpregnant Adults and Adolescents Screening'
}
, { id: 337, title: 'Latent Tuberculosis Infection Screening' }
]
data.sort(({id:a},{id:b})=>(a===329)?-1:(b===329)? 1:a-b)
console.log( data )
.as-console-wrapper {max-height: 100% !important;top: 0;}
.as-console-row::after {display: none !important;}
帶有優先級串列:
const data =
[ { id: 310, title: 'Breast Cancer Screening' }
, { id: 315, title: 'Depression in Adults Screening' }
, { id: 322, title: 'Aspirin Use to Prevent Cardiovascular Disease' }
, { id: 329, title: 'Syphilis Infection in Nonpregnant Adults and Adolescents Screening' }
, { id: 337, title: 'Latent Tuberculosis Infection Screening' }
]
const SortingPrioritize = (PrioList = []) =>
{
return ({id:a},{id:b}) =>
{
let aPos = PrioList.indexOf(a)
, bPos = PrioList.indexOf(b)
;
return (aPos>-1 && bPos>-1) ? aPos - bPos
: (aPos>-1) ? -1
: (bPos>-1) ? 1
: a-b
} }
data.sort( SortingPrioritize([ 329, 315 ]) )
console.log( data )
.as-console-wrapper {max-height: 100% !important;top: 0; }
.as-console-row::after {display: none !important; }
uj5u.com熱心網友回復:
解決方案
基本上,我們希望有兩個排序步驟:
- 按升序對 ID 進行排序。
- 按優先級對 ID 進行排序。
顯示代碼片段
const list = [
{ "id": 329, "title": "Syphilis Infection in Nonpregnant Adults and Adolescents Screening" },
{ "id": 310, "title": "Breast Cancer Screening" },
{ "id": 315, "title": "Depression in Adults Screening" },
{ "id": 322, "title": "Aspirin Use to Prevent Cardiovascular Disease" },
{ "id": 337, "title": "Latent Tuberculosis Infection Screening" }
];
const prioritizeList = (recommendationsList) => {
const prioritizedRecommendations = [...recommendationsList];
const prioritizedIds = [329, 315];
prioritizedRecommendations.sort((a, b) => a.id - b.id);
prioritizedRecommendations.sort((a, b) => {
return prioritizedIds.some(id => id === b.id) - prioritizedIds.some(id => id === a.id);
});
return prioritizedRecommendations;
}
console.log(prioritizeList(list));
請注意,隨后的每個排序都優先于前一個。由于我們希望陣列主要按優先級排序,因此我們最后按優先級排序。
提前優化!
由于我們總是要進行兩次排序,而陣列的初始順序與最終排序無關,我們可以將兩個排序函式合二為一。
將它們合并為一個很容易通過將它們短路來完成:
X || Y,或者用一句話來說,“做 X,如果它無關緊要,做 Y”。
由于我們已經建立了排序函式,并且如果排序無關緊要,它們很方便地回傳零(這是錯誤的),我們可以簡單地將它們組合在一起(將它們短路!)。
在這里,我們實際上是在說:“優先;如果兩者都或都不優先,則按 ID 排序。”
寫出來真的有助于使短路的“跳過”明顯!
顯示代碼片段
const list = [
{ "id": 329, "title": "Syphilis Infection in Nonpregnant Adults and Adolescents Screening" },
{ "id": 310, "title": "Breast Cancer Screening" },
{ "id": 315, "title": "Depression in Adults Screening" },
{ "id": 322, "title": "Aspirin Use to Prevent Cardiovascular Disease" },
{ "id": 337, "title": "Latent Tuberculosis Infection Screening" }
];
const prioritizeList = (recommendationsList) => {
const prioritizedRecommendations = [...recommendationsList];
const prioritizedIds = [329, 315];
prioritizedRecommendations.sort((a, b) => {
return prioritizedIds.some(id => id === b.id) - prioritizedIds.some(id => id === a.id)
|| a.id - b.id;
});
return prioritizedRecommendations;
}
console.log(prioritizeList(list));
請注意,現在第一個運算式被優先考慮而不是相反,因為它現在可以跳過后續運算式 - 再次,請參閱短路。
旁注
Array.prototype.sort()不回傳新的但相同的陣列。變數名稱newArr具有誤導性,因為沒有創建新陣列。相反,我使用擴展語法 ( ...)對陣列進行了淺拷貝。
為了讓它更實用,我讓函式prioritizeList()回傳串列的副本。此外,它現在直接期望該串列,而不是訪問顯然是另一個串列的串列欄位。
理想情況下,您希望為優先 ID 傳遞另一個陣列,但在這里我選擇了硬編碼陣列。在你的代碼中做得更好!
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/451556.html
標籤:javascript 数组 排序 过滤
上一篇:通過沒有共同元素進行分組?
