javascript - 在 Javascript 中处理大型数组的最佳方法是什么?
问题描述
我有一个 React JS 应用程序,它使用 API 来提取一个 JSON 对象,其中包含 10,000 多个对象的数组。然后,该数组用于填充表格,其中包含某些过滤器和复选框、下拉列表中的选项,可以操纵数据。当点击复选框时,在数组上使用过滤器、排序和归约函数来返回可以再次填充表的数组的特定子集。
有 10-15 个选项可供选择,因此每次选中一个框时都会对数据运行 10-15 个过滤器/映射/减少函数。
这些过滤选项现在会在单击复选框和更改表格之间造成明显的延迟。应用程序在计算新数组时冻结。是否有更有效的流程来过滤我的数据?
下面的一些示例函数:
//gameData is an array of 10k+ objects
let inData = gameData
const options = {
dateToTime: new Date('2020-03-01'),
servers:[1,2,3],
maps:['A','B','C']
}
function groupByArray(array, key) {
return array.reduce(function (rv, x) {
let v = key instanceof Function ? key(x) : x[key];
let el = rv.find((r) => r && r.key === v);
if (el) {
el.values.push(x);
} else {
rv.push({ key: v, values: [x] });
} return rv;
}, []);
}
const gamesGrouped = groupByArray(inData, 'gameid')
inData = gamesGrouped.filter(a => a.playername != "new")
inData = inData.filter(game => {
const thisTime = new Date(game.creationtime)
return (thisTime < options.dateToTime)
})
inData = inData.filter(game => options.servers.includes(game.serverip))
inData.filter(game => options.maps.includes(game.map))
提前致谢!
解决方案
我想说不可能给出如何处理数组数据的一般答案,但我可以给出一些指示。
- 嵌套循环时要小心(避免重复相同的迭代)
- 避免间接费用,例如。find() 可以替换为更快的 for 循环(我知道 find() 更容易编写,但是通过将其切换到 for 循环,您可以看到大约 30% 的性能提升)
- 分页 - 您可以使用生成器分块处理数组(例如,如果您只需要显示前 10 个结果,那么处理所有结果会更快)
您提供的代码也有点神秘,您可能希望使用更好的命名。
这是groupByArray() 函数的性能比较:https ://jsbench.me/t7kltjm1sy/1
值得注意的是,每当我处理对性能敏感的情况时,我都会将代码尽可能靠近 VanillaJS,因为对于大型数据集,即使是很小的函数开销也会很明显。
推荐阅读
- kotlin - Kotlin 错误:我是 Kotlin 编程的初学者并提出了这个错误
- html - 如何以适当的间距从网站中提取描述部分?
- php - 如何使用 PDO 准备语句/位置占位符来运行此 PHP 注册脚本?
- java - 无法将 CSS 类添加到我的 JavaFX 标签
- spring - 在我的 spring mvc 项目中添加 requestmapping 注释
- python - Altair - 在 x = y 的绘图中画一条线
- python - 从 python 脚本执行命令行程序(Abaqus-python 脚本)
- r - 使用 R 中的 ggplot2 按顺序循环打印大量图形 (PDF)
- entity-framework - System.TypeInitializationException 发生
- sqlite - 连接多个表 Sqlite Flutter