JavaScript数组的巨大数据(500K记录)需要时间搜索和添加



我的函数在循环中调用,返回超过500k条记录。我必须将记录插入到JavaScript数组中。在向数组插入记录之前,需要检查现有数组是否有重复记录。如果记录重复,则排除该记录。当数组大小增加时,函数的运行时间非常高。请给我一个优化搜索的方法。

function AddDataToArray(StdName, currObjectSTD, bufferObject, attributes, bufferSTD) {
var result = false;


var existingObjects = AllDataArray.find(item => {
item.OBJECTID==attributes.OBJECTID
&& item.name == bufferObject.name
&& item.StdName == StdName);
});
if (existingObjects.length == 0) {          
var currentObject = {
"ID": 0,
"currObjectSTD": currObjectSTD,
"color": bufferObject.color,
"name": bufferObject.name,
"attributes": attributes,
"StdName": StdName,
"objectID": objectID,
"bufferSTD": bufferSTD,
"shape": null,
"shapeSTD": null
};
AllDataArray.push(currentObject);
result = true;
}
return result;
}

作为一种加速方法,我建议您根据您的数组提出某种哈希映射,以避免在数组

中持续循环
const dataHashMap = _(AllDataArray)
.keyBy(item => `${item.OBJECTID}-${item.name}-${item.StdName}`)
.mapValues(() => true)
.value();
var existingObjects = dataHashMap[`${attributes.OBJECTID}-${bufferObject.name}-${StdName}`]

或替代解决方案

let groupedDataHashMap = {}
AllDataArray.forEach(item => {
_.set(
groupedDataHashMap,
[
item.OBJECTID,
item.name,
item.StdName
],
true
)
})
var existingObjects = _.get(
groupedDataHashMap,
[
attributes.OBJECTID,
bufferObject.name,
StdName
],
false
)

我使用lodash方法,但如果你喜欢使用原生数组/对象方法,你可以自己实现,但思想是一样的

p。你需要在获取数组后创建这个哈希映射,并在数组中同时填充新项以使其与数组保持同步

最新更新