javascript - 在子对象键上对 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
解决方案
如果传递的属性包含任何.
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)
推荐阅读
- django - Django REST Framework 使用外键序列化模型
- angular - Angular - 登录后在仪表板上显示用户详细信息
- python - 如何解决scrapy中的scrapy.downloadermiddlewares.redirect错误?
- php - 如果数组再次调用函数
- java - 如何修复错误创建名为“requestMappingHandlerAdapter”的bean
- java - 如何在 Linux 上通过 JFX 窗格组件使用 JavaFX 多点触控事件
- laravel - 如果用户名或电子邮件为空,则停止 Laravel 密码验证
- node.js - Repl.it 程序在 readline 之前终止
- ios - 是否可以加载所有 ios CPU 内核?
- javascript - 有没有办法检查用户是否可以使用 Javascript 解析某个主机名?