TypeScript Filter:如何拆分数组匹配项为单元素数组
解决filter返回分组数组,需转为单元素子数组的问题
你的问题出在直接将filter返回的匹配数组整体推入结果数组,导致多个匹配项被打包成一个子数组。要实现每个匹配元素单独作为单元素数组,你可以参考以下几种方案:
方案1:在原代码基础上修改,遍历匹配项逐个推入
保持你原来的遍历逻辑,在拿到matchedItems后,再遍历每个元素,把每个元素单独包装成数组再推入结果:
const arrayMatchedItems: DetailedUsageVoiceModel[][] = []; voiceFilterObj.arrayCallType[0].callTypes.forEach((callType) => { const matchedItems = callDataList.filter(value => value.type === callType); // 遍历每个匹配元素,单独包装为单元素数组后加入结果 matchedItems.forEach(item => { arrayMatchedItems.push([item]); }); }); console.log("Resultado 2: ", arrayMatchedItems);
方案2:用flatMap简化代码
利用flatMap的特性,直接将每个匹配元素映射为单元素数组,最终得到目标结构:
const arrayMatchedItems = voiceFilterObj.arrayCallType[0].callTypes.flatMap(callType => { // 过滤出匹配元素,再逐个转为单元素数组 return callDataList.filter(value => value.type === callType).map(item => [item]); }); console.log("Resultado 2: ", arrayMatchedItems);
方案3:更高效的单次遍历实现
如果callTypes数量较多,多次调用filter会重复遍历callDataList,可以先把目标类型转为Set,然后只遍历一次callDataList完成过滤和转换:
// 转成Set提升查找效率 const targetCallTypes = new Set(voiceFilterObj.arrayCallType[0].callTypes); const arrayMatchedItems = callDataList .filter(item => targetCallTypes.has(item.type)) // 只保留匹配类型的元素 .map(item => [item]); // 每个元素单独包装成数组 console.log("Resultado 2: ", arrayMatchedItems);
以上三种方案都能得到你期望的输出结构:每个匹配元素单独作为一个单元素子数组,最终结果数组的长度等于所有匹配元素的总数。
内容的提问来源于stack exchange,提问作者Victor York
相关产品推荐
相关产品推荐

