如何用Underscore过滤嵌套对象,提取排除local=true的Message数组?
性能优先的实现方案
实现逻辑
适配当前的固定嵌套结构,结合Jest批量处理数千文件的性能要求,逻辑拆解为三步:
- 遍历传入文件对象的所有属性值(示例结构中每个属性对应的都是配置项数组)
- 逐数组遍历配置条目,直接跳过带有
local: true标记的条目 - 收集剩余条目的
Message字段值组成最终结果数组
代码实现
推荐原生版本(执行最快)
function getValidMessages(fileObj) { const res = []; for (const list of Object.values(fileObj)) { for (const item of list) { if (item.local) continue; res.push(item.Message); } } return res; }
相比原有lodash链式调用,这个版本的性能提升点很明确:
- 砍掉了原逻辑中
_.values、_.flatten、_.pluck三次独立数组遍历产生的临时数组内存开销 - 原生
for循环在V8引擎里的执行效率是所有遍历方式里最高的,批量跑数千个文件时累积的性能差会非常明显 - 不需要依赖lodash的方法查找,运行时额外开销更低
保留lodash的适配版本
如果不想改动现有写法习惯,只需要在原逻辑里加一层过滤就行:
const newData = _(file) .values() .flatten() .filter(item => !item.local) .map('Message') .value();
注意:这个版本的性能比原生循环差不少,处理大数量文件时不建议使用。
结果验证
用给出的示例对象运行上述函数,输出就是符合业务要求的['LAJDH', 'NPSABA']。
另外提一句:给出的示例数据里,local: true那行漏了个行尾逗号,实际使用时要保证入参语法正确,不然会直接报语法错误。
内容的提问来源于stack exchange,提问作者Benjamints
相关产品推荐
相关产品推荐

