如果当前值更接近现在日期,如何找到对象数组?

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