Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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 如何优化node.js中array.forEach的计算速度_Javascript_Arrays_Optimization_Foreach_Computation - Fatal编程技术网

Javascript 如何优化node.js中array.forEach的计算速度

Javascript 如何优化node.js中array.forEach的计算速度,javascript,arrays,optimization,foreach,computation,Javascript,Arrays,Optimization,Foreach,Computation,我有一段代码只是在两个数组中循环,对于第一个数组的每个元素,它在第二个数组中找到相关元素,只更改第一个出现的元素,并删除其余的元素 /** *聚合数据结构: *“_id”:{ *“几何学”:几何学, *“DUP”:[ *“5b3b25b4e54029249c459bfc”,在所有文档中仅保留第一个元素 *“5b3b25b4e54029249c459e65”,从所有文档中删除 *“5b3b25b4e54029249c459d7d”将其从所有文档中删除 * ], *“dupsProp”:[],

我有一段代码只是在两个数组中循环,对于第一个数组的每个元素,它在第二个数组中找到相关元素,只更改第一个出现的元素,并删除其余的元素

/**
*聚合数据结构:
*“_id”:{
*“几何学”:几何学,
*“DUP”:[
*“5b3b25b4e54029249c459bfc”,在所有文档中仅保留第一个元素
*“5b3b25b4e54029249c459e65”,从所有文档中删除
*“5b3b25b4e54029249c459d7d”将其从所有文档中删除
*   ],
*“dupsProp”:[],重复点所有属性的数组
*“计数”:3
*/
var aggregationRes=[46000个对象]
var allDocs=[345000个对象]
aggregationRes.forEach(函数(resElem,计数器){
console.log(计数器+“/”+aggregationRes.length)
//基于dups数组删除除第一个之外的所有文档中的对象
var foundIndex=allDocs.findIndex(x=>x._id.toString()==resElem.dups[0]);
//分配合并属性
allDocs[foundIndex].properties=resElem.dupsProp;
//从dups阵列中删除文档中的剩余ID
resElem.dups.forEach(函数(dupElem,索引){
var tmpFoundIndex=allDocs.findIndex(x=>x.\u id.toString()==resElem.dups[index+1]);
如果(tmpFoundIndex!=-1){
所有文档拼接(tmpFoundIndex,1)
}
})

})
借鉴Bergi的思想,我们按id为文档编制索引,以避免查找昂贵的索引:

var allDocs =[345,000 objects]
var aggregationRes =[46,000 objects]
var allDocsIndexed = {};

allDocs.forEach(function(doc){
    allDocsIndexed[doc._id.toString()] = doc;
});

aggregationRes.forEach(function (resElem, counter) {
    allDocsIndexed[resElem.dups[0]].properties = resElem.dupsProp;
    for (var i = 1; i < resElem.dupsProp.length; i++) {
        delete allDocsIndexed[resElem.dupsProp[i]];
    }
});

var allUndeletedDocs = allDocs.filter(doc => allDocsIndexed.hasOwnProperty(doc_id.toString()));
var allDocs=[345000个对象]
var aggregationRes=[46000个对象]
var allDocsIndexed={};
allDocs.forEach(函数(doc){
allDocsIndexed[doc.\u id.toString()]=doc;
});
aggregationRes.forEach(函数(resElem,计数器){
allDocsIndexed[resElem.dups[0]].properties=resElem.dupsProp;
对于(变量i=1;iallDocsIndexed.hasOwnProperty(doc_id.toString());

请注意,对于javascript来说,这是一个有效的解决方案,但如果提供了更多详细信息,使用mongodb功能可能会有更好的解决方案。

Make
allDocs
按id索引,这样您就不必每次都
findIndex
。并且避免在大数组上执行许多小的
拼接操作,而是将它们标记为删除,然后重新执行一次移动它们。(另外:对如此大的数据使用数据库:-)而不是像
x.\u id.toString()
46K*345K*(dupecount+1)次那样进行操作。创建一个新属性后,迭代allDocs数组,该属性是
x.\u id.toString()
(仅345K次操作).x._id是整个对象吗?还是某个数字/字符串id?是否可以简单地
resElem.dups=[resElem.dups[0]];
而不是
resElem.dups.forEach
迭代?您希望得到一个只包含旧数组中第一个条目的新数组,对吗?看起来很简单,因为您的聚合数据结构示例是错误的/误导性的。看起来_id属性是整个内部对象。这是node.js吗?您使用的是mongodb吗(对“javascript ObjectID”的第一个搜索结果)?如果是的话,可能会想在你的问题中添加这些标签。我想有一种更有效的方法可以使用你的数据库来完成。嘿…你的解决方案非常完美。难以置信。哇哦,我不敢相信。它的速度太快了。不到一分钟,它就完成了我过去在3到4小时内完成的整个计算。我我不知道人们通常怎么说对数组进行索引,但现在通过您的示例,我非常了解它。非常感谢。只是一个简单的问题:我没有使用最后一行(过滤)因为我已经有了所有的结果。你为什么要过滤它们呢?@MaryamKoulaei我们只删除了allDocsIndexed中的键,我们从来没有删除过allDocs中的任何内容。因此,我不删除,只是过滤以获取未删除的键