如何基于字符串数组过滤包含type字段的嵌套对象数组
实现方案
你之前的写法存在两个核心问题:
data.someData是数组,不能直接访问.someNestedData属性,需要先遍历someData的每一项indexOf返回的是匹配元素的下标,不是布尔判断值,且用数组的indexOf/includes做存在性判断性能低于Set结构
最优性能实现
首先将匹配的类型数组转为Set结构,降低单次类型匹配的时间复杂度:
const types = ['type1', 'type2']; const typeSet = new Set(types);
遍历并过滤原数据:
const result = { someData: data.someData.map(outerItem => { // 浅拷贝外层对象,避免修改原数据 return { ...outerItem, // 过滤嵌套数组,仅保留匹配type的元素 someNestedData: outerItem.someNestedData.filter(innerItem => typeSet.has(innerItem.type)) } }) // 如果需要过滤掉嵌套数组为空的外层项,可去掉下面这行的注释 // .filter(outerItem => outerItem.someNestedData.length > 0) };
性能说明
- 类型匹配复杂度从O(k)(k为types数组长度)降到O(1),types长度越大性能提升越明显
- 整体时间复杂度为O(N),N为所有嵌套元素的总数量,是该场景下的最优时间复杂度,没有冗余遍历
内容的提问来源于stack exchange,提问作者PengProgrammer
相关产品推荐
相关产品推荐

