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




