Estoy tratando de hacer una función para obtener los objetos top3 de una matriz basada en accesorios. Mi sitio no se puede cargar, así que creo que esta función se ejecuta sin cesar, pero no puedo entender por qué.
renderItems = (items) => { let top3 = [] let tempArr = items let allNumbers = [] while (top3.length < 3){ allNumbers = [] for(let i = 0; i < tempArr.length; i++){ allNumbers = [...allNumbers, tempArr[i].hearts] } const result = tempArr.filter(i => i.hearts === Math.max(...allNumbers)) top3 = [...top3, ...result] let countOfdeleted = 0 for(let i = 0; i < result.length; i++){ tempArr.splice(result[i].id-countOfdeleted, 1) countOfdeleted++ } for(let i = 0; i < tempArr.length; i++){ tempArr[i].id = i } } console.log(top3); }Esta respuesta se basa en la suposición de que 'elementos' es una matriz de objetos y que cada objeto en 'elementos' tendrá al menos 2 accesorios, a saber, 'id' y 'corazones'.
Además, no hay claridad sobre el significado de 'countOfdeleted' y 'tempArr'. Por lo tanto, se supone
Con los supuestos antes mencionados, a continuación se debe implementar la lógica requerida:
const items = [ { id: 0, hearts: 5 }, { id: 1, hearts: 4 }, { id: 2, hearts: 5 }, { id: 3, hearts: 3 }, { id: 4, hearts: 5 }, { id: 5, hearts: 2 }, { id: 6, hearts: 2 }, { id: 7, hearts: 1 }, { id: 8, hearts: 4 } ]; const getTop3 = (arr = items) => { const maxVal = arr.reduce((fin, itm) => itm.hearts > fin ? itm.hearts : fin, 0); const topAll = arr.filter(obj => obj.hearts === maxVal); const sansTop3 = arr .filter(obj => obj.hearts !== maxVal) .map((obj, idx) => ({...obj, id: idx})); console.log('countOfDeleted: ', arr.length - (topAll.length > 3 ? topAll.length : 3)); console.log('rest with updated-id (tempArr): ', sansTop3); return topAll.length > 3 ? topAll.slice(0, 3) : [...topAll]; }; console.log('\ntop3:\n^^^^\n', getTop3());Enfoque / Explicación