Necesito encontrar el k-ésimo elemento más grande en una matriz (de cadenas) y devolverlos de acuerdo con el rango.
Ejemplo -
Aporte
var array = ['java','python','javascript','C','Swift','Dart'];Rendimiento esperado
[['javascript', 1], ['python', 2], ['Swift', 3], ['java', 4], ['Dart', 4], ['C', 5]]Intenté esto -
var rank = 0 var result = [] var arr = ['java','python','javascript','C','Swift','Dart']; arr.sort((a,b)=>b.length-a.length); for(let i=0;i<arr.length;i++){ if(arr[i+1]===undefined){ break; } else if (arr[i].length>arr[i+1].length){ ++rank} result.push([arr[i],rank]) } console.log(JSON.stringify(result))Pero como puedes ver, no funcionó. ¿Cómo me acerco a esto? Un poco de ayuda, por favor.
const arr = ['java','python','javascript','C','Swift','Dart']; arr.sort((a, b) => b.length - a.length) const res = arr.reduce((acc, el) => {acc.push([el, acc.length == 0 ? 1 : el.length == acc[acc.length-1][0].length ? acc[acc.length-1][1] : acc[acc.length-1][1]+1]); return acc}, []) console.log(JSON.stringify(res))Si quieres hacerlo a tu manera, puedes hacer algo como lo siguiente:
let rank = 1 const arr = ['java','python','javascript','C','Swift','Dart']; arr.sort((a,b)=>b.length-a.length); const result = [[arr[0], 1]] for(let i=1;i<arr.length;i++){ if (arr[i].length<arr[i-1].length){ ++rank} result.push([arr[i],rank]) } console.log(JSON.stringify(result))Podría aprovechar el hecho de que las propiedades del objeto se iteran en orden de valor de índice:
const array = ['java','python','javascript','C','Swift','Dart']; const buckets = Object.fromEntries(array.map(a => [a.length, []])); for (let word of array) buckets[word.length].push(word); const result = Object.values(buckets) .reverse() .map((bucket, rank) => bucket.map(word => [rank+1, word])) .flat(); console.log(result);