【发布时间】:2017-02-27 11:15:57
【问题描述】:
我正在开发一个反应应用程序,我在其中大量使用从 AJAX 请求中获得的数据。假设我可以在myserver.com/people.json 检索数据,其中的数据如下所示:
var peopleList = [
{id:0, name: "John Smith", age: 30},
{id:1, name: "Jane Green", age: 19},
{id:2, name: "Bob Dylan", age: 69},
...
]
people 的列表最终可能在 10,000 到 100,000 之间,我永远不会显示完整的列表,而是通过 id 标识一些子列表和单个实例。
我的问题不在于显示或查询大型顺序数据集,因此分页可能无关紧要。以我需要显示的一些数据为例:
var group = { name: "Woodworking", people_set: [12, 4, 678, 90] }
/* Should come out like:
WOODWORKING
- Peter Johnson
- Anna Holland
- David Green
- Erica Davis
*/
这篇文章已经过编辑,以更好地反映可用选项和作者的推理
我看到四种五种可能的方法来解决这个问题:
1.每次需要显示实例时进行单独的 AJAX 调用
因此,请致电 myserver.com/people/<id>.json 以仅检索所需的数据。我担心这可能会用大量小请求将服务器蜂拥而至,并且需要将大量异步代码混入我的代码中。
2。每次进行一次完整的 AJAX 调用并迭代数组
在初始化时进行调用,数据作为数组保存在内存中(见上文)。每次需要一个实例时,我都会迭代数组,直到找到与 .id 匹配值的对象。
3.和以前一样,但是从对象中查找
我将 Array 转换为一个对象,其中字符串化的键与要查找的 id 匹配。这可能会更快?
{ "0": { name: "John Smith", age: 30},
"1": { name: "Jane Green", age: 19},
"2": { name: "Bob Dylan", age: 69},
...
}
4.我相信列表索引与 id 匹配
由于我控制数据库,我永远不会删除记录并将ids 维护为从 0 开始的顺序列表。查找可以很简单:
peopleList[id]
这似乎仍然是一种高风险的方法,因为无意中删除了主键会导致应用程序无法正常运行。
5.创建一个额外的 indexArray 以快速找到索引
在创建 peopleList 后,创建一个包含 id 的附加数组:[0, 1, 4, ...]。在 indexArray 上使用indexOf() 快速找到索引,并使用该索引从 peopleList 中检索记录。
// This would be the way to lookup a name
peopleList[indexArray.indexOf(<id>)].name
讨论与选择
看起来1 和4 方法只是糟糕的设计。对于查找,方法2 比3 和5 慢两个数量级(!),因此如果您大量使用查找,则应避免使用。虽然3 仍然稍快一些,但我决定选择5,因为保留数组看起来更优雅。
This post 寻址选项2、3 和4,并对查找进行基准比较。
【问题讨论】:
-
最好对它进行分页/偏移。只请求 50-100 人的块,如果需要,加载更多块。
-
我更新了问题以说明为什么分页不是恕我直言的答案。
标签: javascript ajax reactjs object design-patterns