You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:32:39