Digamos que tengo la siguiente función de comparación de matrices:
function cmp_arrs(a, b) { if (a === b) return true; if (a.length != b.length) return false; for (let i=0; i < a.length; i++) if (a[i] != b[i]) return false; return true; } ¿Cómo podría convertir esto, en particular el bucle for , en una función de flecha javascript de una sola línea? Hasta ahora tengo:
const cmp_arrs2 = (a,b) => (a === b) || ((a.length === b.length) && (<forLoop?>))Mi enfoque actual es encadenarlo y ver si funciona, pero parece un poco crudo/incorrecto:
const cmp_arrs2 = (a,b) => (a === b) || ((a.length === b.length) && (Object.values(a).toString() == Object.values(b).toString()))Puede usar una función de orden superior como .every() . Para que .every() devuelva true , la devolución de llamada debe devolver true para cada elemento, si devuelve false para cualquier elemento, .every() dará como resultado false . Puede usar el segundo argumento de la devolución de llamada para obtener el índice i para tomar el elemento correspondiente de la matriz b :
const cmp_arrs2 = (a,b) => a === b || a.length === b.length && a.every((elem, i) => elem === b[i]); && tiene mayor precedencia de operadores que || , por lo que la agrupación () también se puede omitir si lo desea.
Puedes hacer algo como lo siguiente:
// Create a Separate Function const cmp_loop = (a, b) => { for (let i=0; i < a.length; i++) if (a[i] != b[i]) return false; return true; } // Now make a single line function const cmp_array = (a, b) => (a === b) || ((a.length === b.length) && cmp_loop(a, b)) // You can also do this: const cmp_array_2 = (a, b) => (a === b) || ((a.length === b.length) && a.reduce((equal, current, index) => !equal ? equal : current === b[index], true)) // Another quick way (If you are sure that the elements in both arrays are on same positions or indexes): const cmp_array_3 = (a, b) => JSON.stringify(a) === JSON.stringify(b);