Tengo un archivo JSON que contiene el valor del año en una cadena en edu_end_year . Quiero elegir uno si los datos son más de uno en el mismo emp_id cuando el edu_end_year es el más cercano a la fecha ahora.
aquí están los datos:
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 } ]Aquí está el resultado de lo que esperaba:
[ { "emp_id": 1, "edu_degree": "S1", "edu_end_year": 2016 }, { "emp_id": 2, "edu_degree": "S1", "edu_end_year": 2016 } ] Estaba intentando usar filter() y find() , pero aún no tuve suerte.
avíseme si necesita más información para resolver ese problema si aún no es suficiente.
No sé si este código es eficiente para manejar big data o no, pero eso es un trabajo para arreglar si emp_id es el mismo.
sugerencia use este código después de la paginación
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)Puedes usar Array.reducir
reduce() para recorrer cada elementoemp_id en la listaemp_id , verifique qué año es mayor 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)Esto debería hacerlo:
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); Entendí mal su pregunta al principio y cambié mi respuesta en consecuencia ahora. El fragmento anterior usa un único bucle .reduce() para filtrar los elementos más recientes para cada .emp_id .