quiero preguntar sobre array.sort() estaba buscando una solución sobre este tipo de problema sobre cómo ordenar una matriz con este tipo de estructura
array.sort((a, b) => a.foo.foo1.foo2 - b.foo.foo1.foo2)donde funciona pero después de reescribir el código para casos de uso múltiple
export const handleSort = (arr, sortBy, desc) => { arr = [...arr]; if (desc) { return arr.sort((a, b) => b[sortBy] - a[sortBy]); } else { return arr.sort((a, b) => a[sortBy] - b[sortBy]); }más tarde si necesito me gusta
return arr.sort((a, b) => b[sortBy][0][1] - a[sortBy][0][1]);no puedo usar esto
Podría usar una función y una matriz para obtener la propiedad correcta.
const getValue = (object, keys) => keys?.length ? keys.reduce((o, k) => o[k], object) : object, ASC = (a, b) => a - b, DESC = (a, b) => b - a, sortBy = (order, keys) => (a, b) => order(getValue(a, keys), getValue(b, keys)), keys = ['foo', 'foo1', 'foo2'], data = [{ foo: { foo1: { foo2: 7 } } }, { foo: { foo1: { foo2: 2 } } }, { foo: { foo1: { foo2: 9 } } }, { foo: { foo1: { foo2: 6 } } }, { foo: { foo1: { foo2: 1 } } }, { foo: { foo1: { foo2: 4 } } }]; // usage data.sort(sortBy(ASC, keys)); console.log(data); .as-console-wrapper { max-height: 100% !important; top: 0; }¿Tal vez una buena idea es definir la función que manejará la obtención de propiedades para el propósito de comparación?
const handleSort = (arr, desc, getValue) => { if (desc) { return arr.sort((a,b) => getValue(a) - getValue(b)); } return arr.sort((a,b) => getValue(b) - getValue(a)); }De esta manera, puede usar la función superior como:
return handleSort(myArray, true, (obj) => obj.foo.foo1.foo2);