【问题标题】:Sort javascript array of objects on subobject key在子对象键上对 javascript 对象数组进行排序
【发布时间】:2020-08-22 18:30:04
【问题描述】:

我有一个对象数组,其中包含这样的子对象;

var array=[
  {
    "EmployeeName": "John",
    "Experience": "12",
    "data":{
      "Technology":"SharePoint"
    }
  },
  {
    "EmployeeName": "Charles",
    "Experience": "9",
      "data":{
      "Technology":"ASPNET"
    }
  },
  {
    "EmployeeName": "Jo",
    "Experience": "3",
       "data":{
      "Technology":"PHP"
    }
  },
  {
    "EmployeeName": "Daine",
    "Experience": "7",
      "data":{
      "Technology":"javascript"
    }
  },
  {
    "EmployeeName": "Zain",
    "Experience": "6",
     "data":{
      "Technology":"Unity"
    }
  }
];

现在,我想根据子对象键“技术”对这个数组进行排序。我正在使用这里的示例:https://jsfiddle.net/KSPriyaranjan/4Lzr0qux

当它从基础对象中排序时,它就完成了这项工作,但是我如何让它工作:

function GetSortOrder(prop){
   return function(a,b){
      if( a[prop] > b[prop]){
          return 1;
      }else if( a[prop] < b[prop] ){
          return -1;
      }
      return 0;
   }
}

array.sort( GetSortOrder("data.Technology") );

document.write("<br><br> Sorted Technology Names : <br>");

for (var item in array) {
 document.write("<br>"+array[item].Technology);
}

这会产生这个:

Sorted Technology Names :

undefined
undefined
undefined
undefined

希望有人可以在这件事上提供帮助,并在此先感谢 :-) 未定义

【问题讨论】:

  • a["data.Technology"]a["data"]["Technology"] 不同。

标签: javascript arrays sorting


【解决方案1】:

如果传递的属性包含任何.s,请使用reduce 导航到比较之前的最后一个嵌套值:

const GetSortOrder = (accessor) => {
  const getVal = accessor.includes('.')
    ? outer => accessor.split('.').reduce((a, prop) => a[prop], outer)
    : outer => outer;
  return (a, b) => getVal(a).localeCompare(getVal(b));
};

var array=[
  {
    "EmployeeName": "John",
    "Experience": "12",
    "data":{
      "Technology":"SharePoint"
    }
  },
  {
    "EmployeeName": "Charles",
    "Experience": "9",
      "data":{
      "Technology":"ASPNET"
    }
  },
  {
    "EmployeeName": "Jo",
    "Experience": "3",
       "data":{
      "Technology":"PHP"
    }
  },
  {
    "EmployeeName": "Daine",
    "Experience": "7",
      "data":{
      "Technology":"javascript"
    }
  },
  {
    "EmployeeName": "Zain",
    "Experience": "6",
     "data":{
      "Technology":"Unity"
    }
  }
];
const GetSortOrder = (accessor) => {
  const getVal = accessor.includes('.')
    ? outer => accessor.split('.').reduce((a, prop) => a[prop], outer)
    : outer => outer;
  return (a, b) => getVal(a).localeCompare(getVal(b));
};
array.sort( GetSortOrder("data.Technology") );
console.log(array);

条件不是绝对必要的(尽管您可能认为它可以使意图更清晰),您也可以这样做

const getVal = outer => accessor.split('.').reduce((a, prop) => a[prop], outer)

【讨论】:

    【解决方案2】:

    技术不是您的对象的属性。它是您的 object.data 的一个属性。

    尝试改变 javascript array[item].Technology array[item].data.Technology

    【讨论】:

      【解决方案3】:

      您可以通过保持比较方法添加一个函数来获取值。

      function GetSortOrder(prop) {
          const
              keys = prop.split('.'),
              getValue = object => keys.reduce((o, k) => o[k], object);
          
          return function(a, b) {
              const
                  left = getValue(a),
                  right = getValue(b);
              if (left > right) return 1;
              else if (left < right) return -1;
              return 0;
          }
      }
      
      var array = [{ EmployeeName: "John", Experience: "12", data: { Technology: "SharePoint" } }, { EmployeeName: "Charles", Experience: "9", data: { Technology: "ASPNET" } }, { EmployeeName: "Jo", Experience: "3", data: { Technology: "PHP" } }, { EmployeeName: "Daine", Experience: "7", data: { Technology: "javascript" } }, { EmployeeName: "Zain", Experience: "6", data: { Technology: "Unity" } }];
      
      array.sort(GetSortOrder("data.Technology"));
      console.log(array);
      .as-console-wrapper { max-height: 100% !important; top: 0; }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-23
        • 2020-07-11
        • 2019-01-08
        • 2021-07-25
        • 1970-01-01
        • 2013-12-03
        • 2018-12-27
        • 2022-06-17
        相关资源
        最近更新 更多