Javascript 最快的方式;减少;嵌套数组到具有键的对象+;通过键查找的最快方法
我需要转换这种类型的嵌套数组,以便能够以最快的方式按键(id)进行搜索: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":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)
中仍将包含项数组吗?它将包含该数组,但这是您的原始数据。这不是它的副本。所以这张地图就像上面的索引。如果需要,可以删除这些数组,但这需要额外的时间,并且会影响原始结构。同样,它不是一个副本。