Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 根据单独数组的顺序对数组集合进行排序的最有效方法_Javascript - Fatal编程技术网

Javascript 根据单独数组的顺序对数组集合进行排序的最有效方法

Javascript 根据单独数组的顺序对数组集合进行排序的最有效方法,javascript,Javascript,是的,我知道类似的问题,但这里并没有完全涵盖我的用例 我很难找到一种方法来降低这个问题的时间复杂性 我有两个这样的物体 康斯特人=[ { 姓名:'史蒂夫', id:1, 水果盒:6 }, { 姓名:“詹姆斯”, id:2, 水果盒:4 } ] 康斯特之家=[ { id:1, 家庭成员:[ { 姓名:“詹姆斯”, 身份证号码:2 }, { 姓名:'史蒂夫', 身份证号码:1 } ] }, { id:2, 家庭成员:[ { 姓名:“詹姆斯”, 身份证号码:2 }, { 姓名:'史蒂夫', 身份证号码

是的,我知道类似的问题,但这里并没有完全涵盖我的用例

我很难找到一种方法来降低这个问题的时间复杂性

我有两个这样的物体

康斯特人=[ { 姓名:'史蒂夫', id:1, 水果盒:6 }, { 姓名:“詹姆斯”, id:2, 水果盒:4 } ] 康斯特之家=[ { id:1, 家庭成员:[ { 姓名:“詹姆斯”, 身份证号码:2 }, { 姓名:'史蒂夫', 身份证号码:1 } ] }, { id:2, 家庭成员:[ { 姓名:“詹姆斯”, 身份证号码:2 }, { 姓名:'史蒂夫', 身份证号码:1 } ] } ] 所以一个是一个篮子里有水果的人的集合,另一个是一个家庭的集合,每个家庭中的用户与人集合中的用户相同

现在,我想在每个家庭的基础上订购果肉盒计数的用户,所以我已经这样做了

//创建一个空表来存储人员的顺序 让orderTable={}; //使用lodash orderBy根据果品箱中的数量对人员进行排序 people=orderBypeople、['fruitinbacket']、['desc']; //创建表 orderTable=people.ReduceAc,item,index=>{ 返回{ …acc, [项目编号]:索引 } }, {}; //根据“orderTable”中的顺序对每个家庭中的人员进行排序` homes.forEachhome=>{ 让成员=[]; home.familyMembers.forEachmember=>{ 设i=orderTable[member.id]; 成员[i]=成员; }; home.familyMembers=成员; } 因此,您可以立即看到嵌套的for循环,这从来都不是理想的。。但我想不出一个解决办法。这种方法需要对大量数据进行排序,我注意到了巨大的性能问题


任何帮助都将不胜感激

您可以筛选和排序:

康斯特人=[ { 姓名:'史蒂夫', id:1, 水果盒:6 }, { 姓名:“詹姆斯”, id:2, 水果盒:4 }, { 姓名:'塞萨尔', id:3, 水果盒:14 } ] 康斯特之家=[ { id:1, 家庭成员:[ { 姓名:“詹姆斯”, 身份证号码:2 }, { 姓名:'塞萨尔', 身份证号码:3 }, { 姓名:'史蒂夫', 身份证号码:1 } ] }, { id:2, 家庭成员:[ { 姓名:“詹姆斯”, 身份证号码:2 }, { 姓名:'史蒂夫', 身份证号码:1 } ] } ] 家{ home.familyMembers.sorta,b=>people.findx=>x.id==a.id.fruitInBasket-people.findx=>x.id==b.id.fruitInBasket }
console.loghomes您可以筛选和排序:

康斯特人=[ { 姓名:'史蒂夫', id:1, 水果盒:6 }, { 姓名:“詹姆斯”, id:2, 水果盒:4 }, { 姓名:'塞萨尔', id:3, 水果盒:14 } ] 康斯特之家=[ { id:1, 家庭成员:[ { 姓名:“詹姆斯”, 身份证号码:2 }, { 姓名:'塞萨尔', 身份证号码:3 }, { 姓名:'史蒂夫', 身份证号码:1 } ] }, { id:2, 家庭成员:[ { 姓名:“詹姆斯”, 身份证号码:2 }, { 姓名:'史蒂夫', 身份证号码:1 } ] } ] 家{ home.familyMembers.sorta,b=>people.findx=>x.id==a.id.fruitInBasket-people.findx=>x.id==b.id.fruitInBasket }
console.loghomes这应该在日志N上。它的性能瓶颈是一次性排序。其他一切都只是迭代。一些微优化仍然是可能的。 生成有序映射查找表。 只需根据该映射移动数组

有一个hpc排序库,它比内置JavaScript在基准上快10-40倍,可以添加它来提高性能

我不确定,但家庭成员表是否对每个家庭对象都相同?您能否将同一个familyMember数组复制到每个对象,或者它们是否具有不同的属性? 每个家庭的额外优化可能是将上面的表转换为索引到索引的映射,以便本机级别的数组索引将用于后续排序

const orderMap=Object.fromEntriespeople.sortx,y=>x.fruitInBasket-y.fruitInBasket.map{id},i=>[id,i] //ON+ONlogN homes.forEachhome=>{ 常量{familyMembers:fms}=home const arr=新阵列的长度 //可能要预填充以维护压缩阵列:https://v8.dev/blog/elements-kindsavoid-creating-holes fms arr的forconst fm[orderMap[fm.id]]=fm home.familyMembers=arr } //地图查询 休息室 康斯特人=[ { 姓名:'史蒂夫', id:1, 水果盒:6 }, { 姓名:“詹姆斯”, id:2, 水果盒:9 } ] 康斯特之家=[ { id:1, 家庭成员:[ { 姓名:“詹姆斯”, 身份证号码:2 }, { 姓名:'史蒂夫', 身份证号码:1 } ] }, { id:2, 家庭成员:[ { 姓名:“詹姆斯”, 身份证号码:2 } , { 姓名:'史蒂夫', 身份证号码:1 } ] } ]
这应该在日志N上。它的性能瓶颈是一次性排序。其他一切都只是迭代。一些微优化仍然是可能的。 生成有序映射查找表。 只需根据该映射移动数组

有一个hpc排序库,它比内置JavaScript在基准上快10-40倍,可以添加它来提高性能

我不确定,但家庭成员表是否对每个家庭对象都相同?您能否将同一个familyMember数组复制到每个对象,或者它们是否具有不同的属性? 每个家庭的额外优化可能是将上面的表转换为索引到索引的映射,以便本机级别的数组索引将用于后续排序

const orderMap=Object.fromEntriespeople.sortx,y=>x.fruitInBasket-y.fruitInBasket.map{id},i=>[id,i] //ON+ONlogN homes.forEachhome=>{ 常量{familyMembers:fms}=home const arr=新阵列的长度 //可能要预填充以维护压缩阵列:https://v8.dev/blog/elements-kindsavoid-creating-holes fms arr的forconst fm[orderMap[fm.id]]=fm home.familyMembers=arr } //地图查询 休息室 康斯特人=[ { 姓名:'史蒂夫', id:1, 水果盒:6 }, { 姓名:“詹姆斯”, id:2, 水果盒:9 } ] 康斯特之家=[ { id:1, 家庭成员:[ { 姓名:“詹姆斯”, 身份证号码:2 }, { 姓名:'史蒂夫', 身份证号码:1 } ] }, { id:2, 家庭成员:[ { 姓名:“詹姆斯”, 身份证号码:2 }, { 姓名:'史蒂夫', 身份证号码:1 } ] } ]

不确定这如何解决我的时间复杂性问题?它仍然在^2上,您必须遍历各个家庭,这是不可压缩的。那你就有那种了。如果你想提高复杂性,在这一点上可能需要寻找一些东西,但是你可以对我的代码进行基准测试,我认为它相当好,我的意思是它比你最初发布的要快:p你能解释一下它比我的实现快多少吗?我不想表现得粗鲁或是我不知道的任何事情-谢谢我理解,没问题。你们可以在这里比较脚本:但我认为若你们想要性能,你们应该改变人的结构:人应该是一个以ID为键的对象。通过这种方式,您可以更快地检索元素。不客气,我提出了新结构的算法的新版本。不确定这如何解决我的时间复杂性问题?它仍然在^2上,您必须遍历各个家庭,这是不可压缩的。那你就有那种了。如果你想提高复杂性,在这一点上可能需要寻找一些东西,但是你可以对我的代码进行基准测试,我认为它相当好,我的意思是它比你最初发布的要快:p你能解释一下它比我的实现快多少吗?我不想表现得粗鲁或是我不知道的任何事情-谢谢我理解,没问题。你们可以在这里比较脚本:但我认为若你们想要性能,你们应该改变人的结构:人应该是一个以ID为键的对象。通过这种方式,您可以更快地检索元素。不客气,我提出了具有新结构的算法的新版本。您的人员结构是可变的吗?如果每个人员/家庭集的数据集足够小,但您有大量的人员/家庭集,由于对象初始化开销,预构建排序映射的速度可能会较慢,而DJ9114的解决方案最终会更快。在这一点上,为此进行优化:由于本机阵列访问,确保迭代的阵列是同质的,并且没有孔,这将加快几个数量级。然后,您需要摆脱函数调用、对象初始化和其他微观优化。您的人员结构是否可以更改?如果每个人员/家庭集的数据集足够小,但您有大量的人员/家庭集,则由于对象初始化开销,预建排序映射可能会变慢,而DJ9114的解决方案最终会更快。在这一点上,为此进行优化:由于本机阵列访问,确保迭代的阵列是同质的,并且没有孔,这将加快几个数量级。摆脱函数调用、对象初始化和其他微优化将是您所需要的。答案不错,但看看我的,它更快:您的数据结构中没有足够的对象使基准测试有效,并且您已经更改了整个数据结构?如果可以这样简化,您所要做的就是从一个预构建的数组中复制每个数组中的familyMembers。每个循环的查找和排序不可能优于哈希查找。您所测量的只是对象初始化的速度和调用console.log的开销,对于任何类型的数据,差异都是巨大的:对于1000个家庭来说,这个差异是如此之大。你甚至离开了公司
您的新函数实际上执行得稍差,因为只使用对象而丢失了本机数组优化:@user120242 woah您的速度完全正确-我会将此标记为正确答案-非常感谢您的答案,但请看我的答案,它更快:您的数据结构中没有足够的对象使基准有效,并且您改变了整个数据结构?如果可以这样简化,您所要做的就是从一个预构建的数组中复制每个数组中的familyMembers。每个循环的查找和排序不可能优于哈希查找。您所测量的只是对象初始化的速度和调用console.log的开销,对于任何类型的数据,差异都是巨大的:对于1000个家庭来说,这个差异是如此之大。你甚至在基准测试中留下了console.log。你的新函数实际上执行得稍差一些,因为只使用对象就失去了本机数组优化:@user120242 woah你完全正确-快了-我将这标记为正确答案-非常感谢