tengo una matriz de cadenas
const arr = ['ACST', 'CST', 'CCST'];;
Y tengo const word = 'CS';
Cómo ordenar la matriz para que sea
const newArr = ['CST', 'CCST', 'ACST'];
Intenté algo como esto, pero se ve mal y no funciona correctamente; Salida CCST -> CST ...
, debe ser CST -> CCST
arr.sort((a, b) => { let A = 0; let B = 0; for (let i = 0; i < word.length; i++) { if (a.charAt(i) === word.charAt(i)) { A++; } if (b.charAt(i) === word.charAt(i)) { B++; } } return A + B; });
¡Casi lo tienes! Solo necesita devolver -1
o 1
para decirle al algoritmo de clasificación qué valor elegir.
const arr = ['ACST', 'CST', 'CCST'];; const newArr = ['CST', 'CCST', 'ACST']; const word = 'CS' arr.sort((a, b) => { let A = 0; let B = 0; for (let i = 0; i < word.length; i++) { if (a.charAt(i) === word.charAt(i)) { ++A; } if (b.charAt(i) === word.charAt(i)) { ++B; } } return A > B ? -1 : 1; }); console.log(arr)
Si desea ordenar por el número de caracteres coincidentes en los índices correspondientes, debe restar el recuento de las dos cadenas en la función de comparación (es decir A - B
para orden ascendente y B - A
para orden descendente).
const arr = ['ACST', 'CST', 'CCST']; const word = 'CS'; arr.sort((a, b) => { let A = 0; let B = 0; for (let i = 0; i < word.length; i++) { if (a.charAt(i) === word.charAt(i)) A++; if (b.charAt(i) === word.charAt(i)) B++; } return B - A; }); console.log(arr);
Si entendí bien el punto:
const arr = ['CRST','CSX', 'CKST', 'CST', 'CCST']; var lastIndex = 0; console.log( arr.reduce((r, i, index) => { if (i.match(/^CS/) || i.match(/^CS./)) { r.unshift(i); lastIndex = lastIndex+1; } else if (i.match(/CS./)) { r.splice(lastIndex, 0, i); } else r.push(i); return r; }, []) );