tengo esta matriz:
const myArray = [["Cow", 3], ["Pig", 5], ["Pig", 10], ["Pig", 4], ["Chicken", 1], ["Cow", 1], ["Cow" , 12], ["Cow", 11], ["Chicken", 12]]y quiero convertirme en esto: (solo lo mas alto de cada uno)
[ [ 'Pig', 10 ], [ 'Cow', 12 ], [ 'Chicken', 12 ] ]pero con mi código no puedo obtener el último, no puedo encontrar por qué aunque
const myArray = [["Cow", 3], ["Pig", 5], ["Pig", 10], ["Pig", 4], ["Chicken", 1], ["Cow", 1], ["Cow" , 12], ["Cow", 11], ["Chicken", 12]] function getHighest() { var onlyHighest = []; myArray.sort( function(a,b) { if (a[0] == b[0]) return a[1] < b[1] ? -1 : 1; return a[0] < b[0] ? 1 : -1; } ); myArray.forEach((a, i) => { var i = i+1; if (i < myArray.length) { if (a[0] != myArray[i][0]){ onlyHighest.push([a[0], a[1]]); } } }); return console.log(onlyHighest) // [ [ 'Pig', 10 ], [ 'Cow', 12 ] ] }Use un objeto para contener el valor más alto actual para cada animal. Recorra la matriz, reemplazando el valor cuando sea más alto que el valor en el objeto.
const myArray = [["Cow", 3], ["Pig", 5], ["Pig", 10], ["Pig", 4], ["Chicken", 1], ["Cow", 1], ["Cow" , 12], ["Cow", 11], ["Chicken", 12]] function getHighest(array) { let obj = {}; array.forEach(([key, value]) => { if (key in obj) { if (value > obj[key]) { obj[key] = value; } } else { obj[key] = value; } }); return Object.entries(obj); } console.log(getHighest(myArray));Su
myArray.forEach((a, i) => { var i = i+1; if (i < myArray.length) {está causando el problema y es bastante confuso. Si el último fragmento ordenado de la matriz contiene solo 2 elementos, esa condición no se cumplirá, por lo que no se enviará nada de ese fragmento.
Una solución rápida sería empujar incondicionalmente el elemento original si es el último en la matriz.
myArray.forEach((a, i) => { if (i === myArray.length - 1) {Una mejor refactorización sería agrupar la entrada en un objeto que mantenga el valor más grande para cada propiedad, sin necesidad de clasificación.
const myArray = [["Cow", 3], ["Pig", 5], ["Pig", 10], ["Pig", 4], ["Chicken", 1], ["Cow", 1], ["Cow" , 12], ["Cow", 11], ["Chicken", 12]] const grouped = {}; for (const [prop, num] of myArray) { grouped[prop] = Math.max(num, grouped[prop] ?? -Infinity); } const onlyHighest = Object.entries(grouped); console.log(onlyHighest); function funk() { let a = [["Cow", 3], ["Pig", 5], ["Pig", 10], ["Pig", 4], ["Chicken", 1], ["Cow", 1], ["Cow", 12], ["Cow", 11], ["Chicken", 12]]; let r = a.sort((a, b) => { return b[1] - a[1] })[0]; Logger.log(r); } Execution log 12:37:11 PM Notice Execution started 12:37:11 PM Info [Cow, 12.0] 12:37:12 PM Notice Execution completed