Javascript 最快的方式;减少;嵌套数组到具有键的对象+;通过键查找的最快方法

Javascript 最快的方式;减少;嵌套数组到具有键的对象+;通过键查找的最快方法,javascript,node.js,algorithm,performance,reduce,Javascript,Node.js,Algorithm,Performance,Reduce,我需要转换这种类型的嵌套数组,以便能够以最快的方式按键(id)进行搜索: [ { "id":1, "name":"example1", "items":[ { "id":1, "name":"example1", "example":123 }, { "id":2, "name":"

我需要转换这种类型的嵌套数组,以便能够以最快的方式按键(id)进行搜索:

[
   {
      "id":1,
      "name":"example1",
      "items":[
         {
            "id":1,
            "name":"example1",
            "example":123
         },
         {
            "id":2,
            "name":"example1",
            "example":123
         }
      ]
   },
   {
      "id":2,
      "name":"example1",
      "items":[
         {
            "id":3,
            "name":"example1",
            "example":123
         },
         {
            "id":4,
            "name":"example1",
            "example":123
         }
      ]
   }
]
实际上,嵌套数组要多得多(大约4个级别)

我目前的方法是对每个级别进行
减少
,然后我可以使用例如
列表[1]。项目[1]。名称
。在我看来,这是一种非常缓慢和低效的方式

我在这里还发现,我可以创建查找表
id->index
,但它看起来同样复杂,占用了更多内存

是否有人有更好的想法来进行这种转变?我正在处理庞大的数据集,我开始觉得我需要找到更好的方法来处理数据

我这样做是因为我需要通过ID快速搜索此数据集。通过
findIndex
在数组中搜索很慢。而转换需要进行如上所述的处理


我需要找到总体复杂度最低的选项。

进行转换。这是一项值得付出代价的努力,因为你做的每一次搜索都会从投资中获益

这里是到基于
Map
的查找表的转换,用于检索相关对象。它将采用逗号分隔的id值字符串作为查找键:

函数makeLookup(列表,map=newmap,前缀=”){
对于(让列表中的obj){
map.set(前缀+obj.id,obj);
if(obj.items)makeLookup(obj.items,map,前缀+obj.id+“,”);
}
返回图;
}
let list=[{“id”:1,“name”:“example1”,“items”:[
{“id”:1,“name”:“example2”,“example”:123},
{“id”:2,“name”:“example3”,“example”:123}
]},{“id”:2,“name”:“example4”,“items”:[
{“id”:3,“name”:“example5”,“example”:123},
{“id”:4,“name”:“example6”,“example”:123}
]}
];
//一次性转换
let lookup=makeLookup(列表);
//loookup的演示
log(lookup.get(“1,2”).name);

log(lookup.get(“2,3”).示例)进行转换。这是一项值得付出代价的努力,因为你做的每一次搜索都会从投资中获益

这里是到基于
Map
的查找表的转换,用于检索相关对象。它将采用逗号分隔的id值字符串作为查找键:

函数makeLookup(列表,map=newmap,前缀=”){
对于(让列表中的obj){
map.set(前缀+obj.id,obj);
if(obj.items)makeLookup(obj.items,map,前缀+obj.id+“,”);
}
返回图;
}
let list=[{“id”:1,“name”:“example1”,“items”:[
{“id”:1,“name”:“example2”,“example”:123},
{“id”:2,“name”:“example3”,“example”:123}
]},{“id”:2,“name”:“example4”,“items”:[
{“id”:3,“name”:“example5”,“example”:123},
{“id”:4,“name”:“example6”,“example”:123}
]}
];
//一次性转换
let lookup=makeLookup(列表);
//loookup的演示
log(lookup.get(“1,2”).name);

log(lookup.get(“2,3”).示例)
id
显示在多个级别上,您感兴趣的是哪一个?查找表确实是一种方法。请说明为什么这对您来说不够好。在您的问题中添加一些代码,这样我们就可以看到您是如何实现它的,以及可能存在问题的地方。转化你只做一次,每次搜索都能从中获益。所以成本是值得的。假设你想找到id=1,id=1出现在两个地方,应该得到哪一个?@sam id在给定级别上是唯一的
id
出现在多个级别上,你感兴趣的是哪一个?查找表确实是一种方法。请说明为什么这对您来说不够好。在您的问题中添加一些代码,这样我们就可以看到您是如何实现它的,以及可能存在问题的地方。转化你只做一次,每次搜索都能从中获益。所以成本是值得的。假设你想找到id=1,有两个地方id=1出现,哪一个是应该得到的?@sam id在给定的级别上是唯一的,这不是很低的内存效率,因为
。get(1)
仍将包含
数组?它将包含该数组,但这是你的原始数据。这不是它的副本。所以这张地图就像上面的索引。如果需要,可以删除这些数组,但这需要额外的时间,并且会影响原始结构。同样,它不是一个副本。这不是很低的内存效率,因为
.get(1)
中仍将包含
数组吗?它将包含该数组,但这是您的原始数据。这不是它的副本。所以这张地图就像上面的索引。如果需要,可以删除这些数组,但这需要额外的时间,并且会影响原始结构。同样,它不是一个副本。