You need to enable JavaScript to run this app. 如何用Underscore过滤嵌套对象,提取排除local=true的Message数组?
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.07 01:06:08