Dada una serie de objetos tales como
[ {name: "john", power: 1}, {name: "john", power: 129391}, {name: "john", power: 91}, {name: "philip", power: 33}, {name: "philip", power: 883}, {name: "philip", power: 3112333}, ] Me gustaría obtener solo un elemento de cada name : el elemento con más power . El resultado sería:
{name: "john", power: 129391}, {name: "philip", power: 3112333}, Simplemente no sé cómo filtrar uno de cada uno. Puedo filtrar elementos con el mismo nombre pero no con nombres diferentes items.filter(item => item.name === 'john')
Una cosa que pensé fue comparar los elementos con los elementos que ya están en la matriz resultante pero que no han encontrado una forma de acceder a la matriz resultante.
Intenta reducir
const data = [ {name: "john", power: 1}, {name: "john", power: 129391}, {name: "john", power: 91}, {name: "philip", power: 33}, {name: "philip", power: 883}, {name: "philip", power: 3112333}, ] const powerUsersObj = data.reduce((acc,cur) => { acc[cur.name] = acc[cur.name] ? Math.max(acc[cur.name],cur.power) : cur.power return acc },{}) console.log(powerUsersObj) const powerUsersArr = Object.entries(powerUsersObj).map(entry => ({name:entry[0],power:entry[1]})) console.log(powerUsersArr)Use algún diccionario o mapa para realizar un seguimiento de las selecciones anteriores y reemplace los elementos según sea necesario durante la iteración.
var arr = [ {name: "john", power: 1}, {name: "john", power: 129391}, {name: "john", power: 91}, {name: "philip", power: 33}, {name: "philip", power: 883}, {name: "philip", power: 3112333}, ] var selectedItems = {} arr.forEach(item => { const key = item.name; if(selectedItems[key] && selectedItems[key].power < item.power) { selectedItems[key] = item } else if(!selectedItems[key]) { selectedItems[key] = item } }); console.log(Object.values(selectedItems))Recorra la primera matriz y acumule las claves únicas que desea conservar en otra matriz. Luego, vuelva a atravesar, haciendo las comprobaciones que desee en función de cada clave única (en esta power de comparación de clave):
let input = [ { name: "john", power: 1 }, { name: "john", power: 129391 }, { name: "john", power: 91 }, { name: "philip", power: 33 }, { name: "philip", power: 883 }, { name: "philip", power: 3112333 }, ]; let uniqueKeys = input .map((e) => e.name) .filter((key, i) => input.findIndex((e) => e.name === key) === i); let output = uniqueKeys.map( (key) => input .filter((e) => e.name === key) .sort((entryA, entryB) => entryB.power - entryA.power)[0] );