如何高效过滤JavaScript对象中不符合指定type属性的字段?
实现方案
核心优化思路如下:
- 把
types数组转换为Set结构,利用Set O(1)的查找效率,替代原来数组includes方法O(n)的查找开销,当types数组元素较多时性能提升非常明显 - 原有三层遍历是逻辑上不可省略的,因为需要检查每个field元素的类型,只需优化查询环节和冗余判断即可
优化后代码
// 先转Set,全局只需要执行一次 const validTypes = new Set(types); Object.values(data).forEach(suite => { suite.fields.forEach(fieldRow => { // 普通for循环比forEach性能更好,减少函数调用开销 for (let i = 0; i < fieldRow.length; i++) { const field = fieldRow[i]; // 只有field不为null 且 类型不在合法集合中才修改 if (field && !validTypes.has(field.type)) { fieldRow[i] = null; } } }); });
额外可选优化
如果你确定很多行都是全null的情况,可以加一层空行判断,提前跳过无有效元素的行,进一步减少遍历次数:
const validTypes = new Set(types); Object.values(data).forEach(suite => { suite.fields.forEach(fieldRow => { // 当前行全为null直接跳过,不需要遍历每个元素 if (fieldRow.every(item => item === null)) return; for (let i = 0; i < fieldRow.length; i++) { const field = fieldRow[i]; if (field && !validTypes.has(field.type)) { fieldRow[i] = null; } } }); });
如果你的数据规模很小,比如和示例一致只有少量套房、几行数据,两种写法的性能差异几乎感知不到,优化后的写法更适合大规模数据的场景。
内容的提问来源于stack exchange,提问作者niklasbec
相关产品推荐
相关产品推荐

