【问题标题】:Better way to access nested attributes in JavaScript在 JavaScript 中访问嵌套属性的更好方法
【发布时间】:2021-11-26 17:10:59
【问题描述】:

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

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]]....

【问题讨论】:

    标签: javascript object arguments


    【解决方案1】:

    所以我会首先将其他 args 作为休息参数,而不是使用 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,它的旧且行为怪异(以您意想不到的方式)。但解释这超出了这个答案,你可以谷歌它。

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

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

    如果这更具可读性,您需要自己决定。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-12
      • 2016-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-30
      相关资源
      最近更新 更多