【发布时间】:2018-03-11 00:18:04
【问题描述】:
我有一个 30k+ 复杂 JS 对象的列表。列表中的每个对象都有一个 name 属性。
我希望能够在不借助数据库的情况下尽快按名称找到对象。
关于性能的 3 个问题浮现在脑海中。
查询平面列表 - [{name: 'a'}, {name: 'b'}, {name: 'c'}] 还是查询嵌套结构的数据 - { group1 : [{name: 'a'}, {name: 'b'}], group2: [{name: 'c'}] } 更快?
第二个密切相关的问题,查询这个是否更快:
`[{name: 'a'}, {name: 'b'}, {name: 'c'}]`
或者这个:
{ a: {name: 'a'}, b: {name: 'b'}, c: {name: 'c'} }
第三,原生 JS 代码更快还是我应该使用 lodash(因为我的代码可能性能较差???)是否有任何库可以帮助解决这个问题 - JavaScript 库或 npm 包。
【问题讨论】:
-
这些都与 JSON 无关。
-
最好的办法可能是使用流式 JSON 解析器而不是
JSON.parse。结构在这里并没有真正的影响。 -
要通过某个唯一标识符(就像
name似乎是)获取单个项目,这个{ a: {name: 'a'}, b: {name: 'b'}, c: {name: 'c'} }通常比[{name: 'a'}, {name: 'b'}, {name: 'c'}]快得多。O(1)与O(n)。当您需要获取数据的子集时,该数组更方便并且可能更快;想想数组#filter。通常我有两个结构并排。但这引入了新的复杂性,因为您现在需要注意使两个结构保持同步。就像您添加/删除/替换项目一样。 -
具有已知密钥的哈希表访问:
O(1)。查找一个未排序数组的项目:O(n)其中n是数组长度。在排序数组中查找项目:O(log(n))其中n是数组的长度。对于 30k 长度,如果您需要按名称调用而不是重复搜索数组,您几乎肯定会想要对名称进行散列,但如果您要执行后者,至少先对其进行排序,进行一些缓存等. -
... 或根据您的问题来构建它,为您的数据(作为哈希表)执行
b需要 1 个单位的时间。对排序后的数据(作为数组)进行二进制搜索需要 14 倍的时间。对数据(作为数组)进行暴力搜索需要 30000 倍的时间。
标签: javascript json node.js lodash