我有 JSON 檔案,其中包含字串中的年份值edu_end_year。emp_id如果edu_end_year現在最接近日期的資料超過一個,我想選擇一個。
這是資料:
educations = [
{
"emp_id": 1,
"edu_degree": "SMA",
"edu_end_year": 2011
},
{
"emp_id": 1,
"edu_degree": "S1",
"edu_end_year": 2016
},
{
"emp_id": 2,
"edu_degree": "S1",
"edu_end_year": 2016
}
]
這是我所期望的結果:
[
{
"emp_id": 1,
"edu_degree": "S1",
"edu_end_year": 2016
},
{
"emp_id": 2,
"edu_degree": "S1",
"edu_end_year": 2016
}
]
我正在嘗試使用filter()and find(),但仍然沒有運氣。
如果還不夠,請告訴我您是否需要更多資訊來解決該問題。
uj5u.com熱心網友回復:
解決此問題的一種方法是使用 a并存盤每個Map最高的教育。edu_end_yearemp_id
const maxEducations = new Map();
for (const education of educations) {
const maxEducation = maxEducations.get(education.emp_id);
if (maxEducation && education.edu_end_year <= maxEducation.edu_end_year) continue;
maxEducations.set(education.emp_id, education);
}
maxEducation如果找到并且當前education.edu_end_year小于或等于,則 if 陳述句將跳過剩余的迭代maxEducation.edu_end_year.
如果maxEducation未設定任何一個,或者我們遇到新的最大值edu_end_year,則當前教育設定為新的最大值。
一旦您遍歷了所有教育并且您希望擁有一組值,您可以執行以下操作
const result = Array.from(maxEducations.values());
顯示代碼片段
const educations = [
{
"emp_id": 1,
"edu_degree": "SMA",
"edu_end_year": 2011
},
{
"emp_id": 1,
"edu_degree": "S1",
"edu_end_year": 2016
},
{
"emp_id": 2,
"edu_degree": "S1",
"edu_end_year": 2016
}
];
const maxEducations = new Map();
for (const education of educations) {
const maxEducation = maxEducations.get(education.emp_id);
if (maxEducation && education.edu_end_year <= maxEducation.edu_end_year) continue;
maxEducations.set(education.emp_id, education);
}
console.log(Array.from(maxEducations.values()));
uj5u.com熱心網友回復:
我不知道這段代碼是否能有效處理大資料,但如果emp_id相同,則可以解決。
建議分頁后使用此代碼
educations = [
{
"emp_id": 1,
"edu_degree": "SMA",
"edu_end_year": 2011
},
{
"emp_id": 1,
"edu_degree": "S1",
"edu_end_year": 2016
},
{
"emp_id": 2,
"edu_degree": "S1",
"edu_end_year": 2016
},
{
"emp_id": 2,
"edu_degree": "S1",
"edu_end_year": 2016
},
{
"emp_id": 2,
"edu_degree": "S1",
"edu_end_year": 2016
}
]
for (let i = educations.length -1; i > 0; i--){
if(educations[i].emp_id === educations[i-1].emp_id){
educations.splice(i, i)
}
}
console.log(educations)
uj5u.com熱心網友回復:
您可以使用Array.reduce
- 用于
reduce()回圈遍歷每個元素 - 通過簽
emp_id入串列來檢查您的最終陣列(acc)是否包含專案 - 如果它是第一項,則插入
- 如果相同
emp_id,則檢查哪一年更大 - 將較新的年份記錄替換為最終陣列
educations = [
{
"emp_id": 1,
"edu_degree": "SMA",
"edu_end_year": 2011
},
{
"emp_id": 1,
"edu_degree": "S1",
"edu_end_year": 2016
},
{
"emp_id": 2,
"edu_degree": "S1",
"edu_end_year": 2015
},
{
"emp_id": 2,
"edu_degree": "S13",
"edu_end_year": 2017
},
{
"emp_id": 2,
"edu_degree": "S14",
"edu_end_year": 2016
}
]
finalArr = educations.reduce((acc, prev) => {
if(!acc.find(x=>x.emp_id === prev.emp_id)){
acc.push(prev)
}
else{
let record = acc.find(x=>x.emp_id === prev.emp_id);
if(prev.edu_end_year >= record.edu_end_year){
let index = acc.findIndex(x=>x.emp_id === prev.emp_id);
acc[index] = prev;
}
}
return acc;
}, []);
console.log(finalArr)
uj5u.com熱心網友回復:
這應該這樣做:
const educations = [{"emp_id": 1,"edu_degree": "SMA","edu_end_year": 2011},
{"emp_id": 1,"edu_degree": "S1","edu_end_year": 2016},
{"emp_id": 3,"edu_degree": "S3","edu_end_year": 2014},
{"emp_id": 2,"edu_degree": "S1","edu_end_year": 2016}];
const res=Object.values(educations.reduce((a,c)=>{
if(!a[c.emp_id]||a[c.emp_id].edu_end_year<c.edu_end_year) a[c.emp_id]=c;
return a;
},{}));
console.log(res);
我一開始誤解了你的問題,現在相應地改變了我的答案。上面的代碼片段使用一個.reduce()回圈來過濾掉每個.emp_id.
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/478576.html
標籤:javascript json 目的
