Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.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 如何使用Array.reduce优化此聚合_Javascript - Fatal编程技术网

Javascript 如何使用Array.reduce优化此聚合

Javascript 如何使用Array.reduce优化此聚合,javascript,Javascript,我已经附上了一个工作片段,我正在寻找更优化的解决方案,因为我将处理相当大的数据量。任何具有相当低的复杂性和更优化的解决方案,您可以建议谢谢 让数据=[ { 类别名称:家, 我的父母:是的 }, { 类别名称:城市, 我的父母:是的 }, { 类别名称:家乡, 家长:家, 我的父母:错 }, { 类别名称:城镇, 家长:城市, 我的父母:错 } ] /** *请求 *让数据=[ *{类别名称:家, *儿童:[{}] * } * ] */ 设res=data.reduceac,ele=>{ 设ob

我已经附上了一个工作片段,我正在寻找更优化的解决方案,因为我将处理相当大的数据量。任何具有相当低的复杂性和更优化的解决方案,您可以建议谢谢

让数据=[ { 类别名称:家, 我的父母:是的 }, { 类别名称:城市, 我的父母:是的 }, { 类别名称:家乡, 家长:家, 我的父母:错 }, { 类别名称:城镇, 家长:城市, 我的父母:错 } ] /** *请求 *让数据=[ *{类别名称:家, *儿童:[{}] * } * ] */ 设res=data.reduceac,ele=>{ 设obj={ 儿童:[] } 如果ele.isparent{ obj=ele; obj.children=[]; 根据pushobj; }否则{ 让_filt=acc.find_ele=>_ele.category_name==ele.parent _过滤、儿童、普舍尔; } 返回acc; }, []
console.logJSON.stringifyres 由于嵌套的acc.find,您当前的解决方案效率低下-它将导致解决方案在^2上接近。您可以实现一个更高效的解决方案,因为您有唯一的键,只需让map/dictionary原生js对象可以很好地实现这一点-我认为这是一种更容易使用的格式,但您可以简单地使用object.valuesmap来获得请求的输出格式

let data=[{category\u name:Home,isparent:true},{category\u name:City,isparent:true},{category\u name:Home,parent:false},{category\u name:City\u town,parent:City,isparent:false}]; 设res=Object.valuesdata.reduceac,ele=>{ 如果ele.isparent{ acc[ele.category_name]=ele; ele.children=[]; }否则{ acc[ele.parent].children.pushele; } 返回acc; }, {};
console.logJSON.stringifyres 你喜欢这个工作吗?不确定是否更有效,但可能有一点

常量as_obj=data.reduceacum,curr=>{ 常量{category_name,isparent,parent}=curr; 如果isparent和accum[类别名称]{ //这是一个家长,但我们已经看到了它的一个孩子; //我们已经为它创建了父密钥。 返回累计; } 如果isparent&!accum[类别名称]{ //这是我们第一次看到父键,为它创建一个对象。 返回{…累计[category_name]:{…curr,children:[]}; } 如果父项&&!累计[父项]{ //我们还没见过这个孩子的父母,但我们会给他找个地方的。 累计[父项]={类别名称,子项:[]}; } const children=[…累计[父].子对象,当前]; 返回{…acum,[父]:{…acum.parent,children}; }, {}; const res=Object.valuesas_obj;
请推荐任何图书馆…->我已经编辑过了。你想要什么样的数据结构?这可能会有所帮助。尝试使用MongoDB之类的数据库获取大量数据,这些数据将在snippet@dmitrydwite中出现。考虑性能时,请避免像瘟疫一样传播运算符。每次使用spread运算符都需要在额外的时间内迭代整个对象/数组,例如当accum[category_name]=curr时,这是不必要的;或者accum[parent].children.pushcurr更短、更快、可读性更强。此外,由于topI不这么认为,在没有父属性的对象上,此代码将出错;只要curr是一个对象,它就可以被分解。如果它没有父属性,那么变量parent将是未定义的。嗯,你是对的,我错了。我记得不久前遇到过类似的问题,当时我一定是误解了原因。