Tengo una serie de objetos:
[ { name: "John", age: "34" }, { name: "Ace", age: "14" }, { name: "John", age: "45" }, { name: "Harry", age: "11" }, ]Quiero comparar los objetos dentro de una matriz por nombre. Si existe el nombre duplicado, debo comparar la edad y solo mantener el objeto de mayor edad.
El resultado esperado debe ser:
[ { name: "Ace", age: "14" }, { name: "John", age: "45" }, { name: "Harry", age: "11" }, ]Soy nuevo en javascript/typescript y no pude encontrar ninguna solución óptima para este problema. Espero haber podido explicar mi problema claramente.
Gracias.
Tal vez algo así
const obj = [{ name: "John", age: "34" }, { name: "Ace", age: "14" }, { name: "John", age: "45" }, { name: "Harry", age: "11" }]; const objCopy = JSON.parse(JSON.stringify(obj)) const res = objCopy.reduce((acc, obj) => { const personExist = acc.find(({ name }) => name === obj.name); if (personExist) { if (parseInt(obj.age, 10) > parseInt(personExist.age, 10)) { personExist.age = obj.age; } } else { acc.push(obj); } return acc; }, []); console.log({ res }); .as-console-wrapper { min-height: 100%!important; top: 0; }El siguiente enfoque proporcionado usa reduce y crea en un primer paso solo un índice/mapa de elementos de mayor antigüedad, cada uno de los cuales es único por su nombre. Por lo tanto, se podría usar el estado temporal del result creado programáticamente como búsqueda de elementos de name d ya existentes.
En un segundo paso, uno recuperaría la matriz de elementos únicos con nombre de mayor antigüedad pasando dicho índice a Object.values .
function collectHighestAgeItemOfSameName(result, item) { const { name, age } = item; if ( !(name in result) || Number(result[name].age) < Number(age) ) { result[name] = item; } return result; } const sampleData = [{ name: "John", age: "34" }, { name: "Ace", age: "14" }, { name: "Harry", age: "9" }, { name: "John", age: "45" }, { name: "Harry", age: "11" }, { name: "Ace", age: "13" }]; console.log( 'reduced index of unique person items of highest age ...', sampleData .reduce(collectHighestAgeItemOfSameName, {}) ) console.log( 'array of unique person items of highest age ...', Object .values( sampleData .reduce(collectHighestAgeItemOfSameName, {}) ) ) .as-console-wrapper { min-height: 100%!important; top: 0; }prueba esto
var objArr=...your json object; var maxValueGroup = "name"; var maxValueName = "age"; console.log(JSON.stringify(newArr(objArr,maxValueGroup, maxValueName)));nuevoArr
var newArr = function (objArr,maxValueGroup, maxValueName) { var arr = groupBy(objArr, maxValueGroup); var newArr = []; $.each(arr, function (key) { var maxVal = 0; var maxValItem; arr[key].forEach((element) => { if (element[maxValueName] > maxVal) { maxVal = element[maxValueName]; maxValItem = element; } }); newArr.push(maxValItem); }); return newArr; };agrupar por
var groupBy = function (xs, key) { return xs.reduce(function (rv, x) { (rv[x[key]] = rv[x[key]] || []).push(x); return rv; }, {}); };