You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用JS filter或Lodash方法过滤attributeScore>90的嵌套数组

嘿,我来帮你搞定这个嵌套数组的过滤问题!根据你给出的结构,我会分几种常见的需求场景来实现,你可以根据自己的实际需要选:

场景1:保留所有包含至少一个attributeScore>90的mechanic的truck元素

如果你的目标是保留整个truck对象——只要它的wheels数组里存在任何一个mechanic的attributeScore大于90,就把这个truck留下来,用原生JS可以这么写:

const filteredTrucks = trucks.filter(truck => 
  // 检查当前truck的wheels里有没有符合条件的wheel
  truck.wheels.some(wheel => 
    // 检查当前wheel的mechanics里有没有分数超90的项
    wheel.mechanics.some(mechanic => mechanic.attributeScore > 90)
  )
);

这里的some()函数是关键,它只要找到一个符合条件的元素就会返回true,刚好用来判断上层元素是否需要被保留。

场景2:提取所有包含合格mechanic的wheel元素

如果你的需求是从所有truck里,把那些带有attributeScore>90的mechanic的wheel单独提取出来,可以用flatMap()把嵌套的数组摊平:

const filteredWheels = trucks.flatMap(truck => 
  truck.wheels.filter(wheel => 
    wheel.mechanics.some(mechanic => mechanic.attributeScore > 90)
  )
);

flatMap()会把每个truck过滤后的wheels数组合并成一个一维数组,不用你自己再手动拼接。

场景3:直接获取所有attributeScore>90的mechanic对象

如果只需要拿到所有分数达标的mechanic本身,那就两层flatMap()摊平嵌套结构,再过滤:

const filteredMechanics = trucks.flatMap(truck => 
  truck.wheels.flatMap(wheel => 
    wheel.mechanics.filter(mechanic => mechanic.attributeScore > 90)
  )
);

用Lodash实现的方案

如果你习惯用Lodash,它的函数能让写法更简洁,逻辑和原生JS是一致的:

保留符合条件的truck

const filteredTrucks = _.filter(trucks, truck => 
  _.some(truck.wheels, wheel => 
    _.some(wheel.mechanics, mechanic => mechanic.attributeScore > 90)
  )
);

直接提取合格的mechanic

用Lodash的链式调用会更清爽:

const filteredMechanics = _(trucks)
  .flatMap('wheels')  // 摊平所有truck的wheels数组
  .flatMap('mechanics')  // 摊平所有wheel的mechanics数组
  .filter(mechanic => mechanic.attributeScore > 90)  // 过滤分数达标的项
  .value();  // 获取最终的数组结果

这里要提一句:你提到的_.find()是用来查找第一个符合条件的元素,而不是筛选所有符合条件的,所以如果要批量过滤,还是得用_.filter()_.some()则和原生的作用一样,用来判断是否存在符合条件的元素,常作为上层过滤的判断条件。

内容的提问来源于stack exchange,提问作者karthik006

火山引擎 最新活动