javascript - 如果当前的 value 更接近现在的 date,如何找到 object 的数组?

我在 edu_end_year 的字符串中有包含年份 value 的 JSON 文件。当 edu_end_year 现在最接近 date 时,如果同一 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(),但仍然没有运气。

如果还不够,请告诉我您是否需要更多信息来解决该问题。

回答1

解决此问题的一种方法是对每个 emp_id 使用 Map 和 store 具有最高 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 语句将跳过剩余的迭代

如果 maxEducation 未设置,或者我们遇到新的最大值 edu_end_year,则当前教育设置为新最大值。

一旦你遍历了所有的教育并且你想要一个 values 的数组,你可以执行以下操作

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()));

回答2

我不知道这段代码是否能有效处理大数据,但如果 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)

回答3

您可以使用 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/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)

回答4

这应该这样做:

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 的最新元素。

相似文章