首页 > 解决方案 > 在子对象键上对 javascript 对象数组进行排序

问题描述

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

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

希望有人可以在这件事上提供帮助,并提前致谢:-) undefined

标签: javascriptarrayssorting

解决方案


如果传递的属性包含任何.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)

推荐阅读