JavaScript判断数组包含指定对象的性能优化问题咨询
预过滤方案的性能对比
先说结论:绝大多数场景下预过滤后比对的性能优于全量直接比对。
你给出的示例中currentArray符合balance为999/999.999的元素只有4条,仅占总长度的40%,过滤后双层比对的遍历次数直接减少60%,性能提升非常明显。当然这个方案的收益取决于符合条件的元素占比:如果符合要求的元素占比越高,预过滤的收益越低,占比接近100%时和全量比对性能基本持平。
但要注意,这个方案本质还是双层遍历逻辑,最坏时间复杂度依旧是O(n*m)(n为过滤后currentArray长度、m为testArray长度),只是常数项变小了。
更优的实现方案
可以用哈希集合做预处理,把时间复杂度降到线性的O(n+m),性能远高于双层遍历,数组规模越大优势越明显:
// 预处理currentArray,生成符合条件的元素的唯一标识集合 const validKeySet = new Set() for (const item of currentArray) { if (item.balance === 999 || item.balance === 999.999) { // 拼接account+balance作为唯一匹配键,如果你确定testArray的balance必为999/999.999,也可以只用account当键 validKeySet.add(`${item.account}-${item.balance}`) } } // 1、如果需要获取testArray每个元素是否存在的结果 const testResult = testArray.map(item => ({ ...item, isExist: validKeySet.has(`${item.account}-${item.balance}`) })) // 2、如果只需要判断testArray是否存在至少一个匹配元素 const hasMatch = testArray.some(item => validKeySet.has(`${item.account}-${item.balance}`))
这个方案只需要分别遍历两个数组各一次,哈希查询的时间复杂度为O(1),不管数组长度是几千还是几万,性能都非常稳定。
内容的提问来源于stack exchange,提问作者Oscar
相关产品推荐
相关产品推荐

