Tengo esta función en la que quiero acceder a los atributos anidados de los argumentos pasados dentro de la función.
var objectsArr = [ {nestedobj:{property:'1'}}, {nestedobj:{property:'3'}}, {nestedobj:{property:'2'}}, {nestedobj:{property:'4'}} ]; function sortObjectsArr(objectsArray) { if (arguments.length == 2) { objectsArray.sort((a,b) => a[arguments[1]] - b[arguments[1]]); } if (arguments.length == 3) { objectsArray.sort((a,b) => a[arguments[1]][arguments[2]] - b[arguments[1]][arguments[2]]); } if (arguments.length == 4) { objectsArray.sort((a,b) => a[arguments[1]][arguments[2]][arguments[3]] - b[arguments[1]][arguments[2]][arguments[3]]); } //and so on and so forth } sortObjectsArr(objectsArr, 'nestedobj', 'property'); console.log(objectsArr); ¿Hay una forma más agradable de acceder a los atributos del objeto? en lugar de [arguments[1]][arguments[2]][arguments[3]].... ?
Entonces, primero tomaría los otros argumentos como un parámetro de descanso en lugar de usar la matriz de argumentos. Entonces definiría una pequeña función auxiliar.
function sortObjectsArr(objectsArray, ...path) { objectsArray.sort((a, b) => getFromPath(a, path) - getFromPath(b, path)) } function getFromPath(obj, path) { let r = obj; path.forEach(key => { r = r[key]}) return r } let objectsArr = [ {nestedobj:{property:'1'}}, {nestedobj:{property:'3'}}, {nestedobj:{property:'2'}}, {nestedobj:{property:'4'}} ]; sortObjectsArr(objectsArr, 'nestedobj', 'property'); console.log(objectsArr); Finalmente: evite usar var , use let en su lugar, es antiguo y se comporta de manera extraña (de formas que no esperaría). Pero explicar eso está fuera de esta respuesta, puede buscarlo en Google.
EDITAR: si quieres ser realmente genial, puedes usar la función de reducción:
function getFromPath(obj, path) { return path.reduce((o, key) => o[key], obj) }Si esto es más legible, debe decidir por sí mismo.