如果当前值更接近现在日期,如何找到对象数组?
How to find array of object if current value more closest to now date?
我有 JSON 文件,在 edu_end_year
中的字符串中包含年份值。当 edu_end_year
现在最接近日期时,如果同一 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": 1,
"edu_degree": "S1",
"edu_end_year": 2016
},
{
"emp_id": 2,
"edu_degree": "S1",
"edu_end_year": 2016
}
]
我尝试使用 filter()
和 find()
,但还是不行。
如果您需要更多信息来解决该问题,如果仍然不够,请告诉我。
我不知道此代码是否有效处理大数据,但如果 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)
您可以使用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)
应该这样做:
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
.
的最新元素
解决这个问题的一种方法是使用 Map
并为每个 emp_id
.
存储具有最高 edu_end_year
的教育
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
小于或等于 maxEducation.edu_end_year.
,if-statment 将跳过剩余的迭代
如果 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()));
我有 JSON 文件,在 edu_end_year
中的字符串中包含年份值。当 edu_end_year
现在最接近日期时,如果同一 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": 1,
"edu_degree": "S1",
"edu_end_year": 2016
},
{
"emp_id": 2,
"edu_degree": "S1",
"edu_end_year": 2016
}
]
我尝试使用 filter()
和 find()
,但还是不行。
如果您需要更多信息来解决该问题,如果仍然不够,请告诉我。
我不知道此代码是否有效处理大数据,但如果 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)
您可以使用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)
应该这样做:
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
.
解决这个问题的一种方法是使用 Map
并为每个 emp_id
.
edu_end_year
的教育
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
小于或等于 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()));