Javascript 根据嵌套键值对对象数组进行排序的最快方法
我试图根据对象中深度嵌套的键值对包含大约100个大型实体(几乎30个键)的对象数组进行排序,为此我使用了lodash的orderBy方法:Javascript 根据嵌套键值对对象数组进行排序的最快方法,javascript,arrays,reactjs,sorting,time-complexity,Javascript,Arrays,Reactjs,Sorting,Time Complexity,我试图根据对象中深度嵌套的键值对包含大约100个大型实体(几乎30个键)的对象数组进行排序,为此我使用了lodash的orderBy方法: let name = (user) => user.accountDetails.name.toLowerCase(); let dob = (user) => user.personalProfile.dob; orderBy(cloneDeep(data), [name, dob], [sortOrder1, sortOrder2])
let name = (user) => user.accountDetails.name.toLowerCase();
let dob = (user) => user.personalProfile.dob;
orderBy(cloneDeep(data), [name, dob], [sortOrder1, sortOrder2])
*将分拣机视为desc或asec
但是排序过程花费的时间相当大。什么样的
我们可以使用更快的方法来使用
埋藏在物体深处的钥匙
示例数据(考虑50个这样的条目,至少有40个键)
1.使用JavaScript内置的sort()
函数
我们可以使用JavaScript的内置数组sort()
方法,该方法可以非常快速、很好地对这一切进行排序。如果希望原始数组保持不变,则在数组的副本上而不是数组本身上运行sort()
方法非常重要。我们可以通过两种非常简单的方法来实现这一点:
array.slice.sort(…)
[…数组].排序(…)
const数据=[{
列表:“bugs42”,
起始日期:“2015-08-27”,
accountDetails:{名称:“钻石”,文本:“8个月”,毫秒数:19936427304},
个人资料:{姓名:“斯塔克”,出生日期:“2003-03-12T09:26:39.980Z”}
}, {
列表:“bugs50”,
起始日期:“2015-08-27”,
accountDetails:{name:“ruby”,文本:“8个月”,毫秒数:19936427305},
个人资料:{姓名:“战争机器”,dob:“2007-03-31T09:26:39.980Z”}
}];
const sortByDobAsc=data=>[…data].sort((a,b)=>新日期(a.personalProfile.dob)-新日期(b.personalProfile.dob));
const sortByDobDes=data=>[…data].sort((a,b)=>新日期(b.personalProfile.dob)-新日期(a.personalProfile.dob));
log(sortByDobAsc(数据),sortByDobDes(数据))
Lodash也在使用javascript的builtin.sort方法,但我正在寻找比这个特定案例更快的方法。我在考虑将对象展平,然后执行父级排序。但展平的成本也更高,而且会花费更多的时间-complexity@Stark我懂了。通读一遍,似乎有几种自定义排序算法可供选择,甚至可以构建。从他们的比较来看,最快的似乎是Chrome和Safari中的QuickInsertionSort
,以及Firefox中的其他quickSort
函数,其中QuickInsertionSort
在某些情况下奇怪地变得与本机JSsort()
方法一样慢。我会更新我的答案来说明这一点。嗯,我必须收集一些关于这种混合排序技术对大型对象的性能的统计数据。谢谢@Brandon McConnell如果有机会,请看一看这篇文章。他展示了每个人的具体统计数据,每个人都展示了他是如何相互比较的。这是否回答了你的问题?您不需要将字符串转换为日期对象。字符串将按照ISO 8601格式的顺序自然排序。不,因为.sort()内部使用混合排序技术,而且由于对象非常大,我们应该采用一种方法,即交换次数最少,是的,我们可以删除显式日期转换@HereticMonkey
{
"list": "bugs42",
"start-date": "2015-08-27",
"accountDetails": {
"name": "diamond",
"text": "8 months",
"milliseconds": 19936427304
}
"personalProfile": {
"name": "stark",
"dob": "2003-03-12T09:26:39.980Z",
}
},
{
"list": "bugs50",
"start-date": "2015-08-27",
"accountDetails": {
"name": "ruby",
"text": "8 months",
"milliseconds": 19936427305
}
"personalProfile": {
"name": "warmachine",
"dob": "2007-03-31T09:26:39.980Z",
}
}