在 JavaScript 中访问嵌套属性的更好方法

Better way to access nested attributes in JavaScript

我有这个函数,我想在其中从函数内部传递的参数访问嵌套属性。

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);

有没有更好的方法来访问对象的属性?而不是 [arguments[1]][arguments[2]][arguments[3]].... ?

所以我会先将其他args作为rest参数,而不是使用arguments数组。 然后我会定义一个小的辅助函数。

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);

最后:避免使用 var,改用 let,它很旧而且行为怪异(以您意想不到的方式)。但是解释这超出了这个答案,你可以 google 它。

编辑:如果你想变得很酷,你可以使用 reduce 函数:

function getFromPath(obj, path) {
     return path.reduce((o, key) => o[key], obj)
}

如果这更易读,您需要自己决定。