如何不使用for循环或forEach过滤Map并转为数组?附场景示例
问题分析与解决
你的代码返回['1','5']是因为**filter方法的作用是筛选原数组的元素,而非转换元素**:当回调返回真值时,它会把原数组中的当前元素(也就是id字符串)保留下来,而不是把你返回的carMap[id]作为结果元素。
正确实现方式
方法1:map + filter组合
先通过map把每个id转换成对应的car对象,再用filter过滤掉不存在的项(避免id不在carMap中时出现undefined):
const carMap = { '1' : {id: '1', isPresent: true}, '2' : {id: '2', isPresent: true}, '3' : {id: '3', isPresent: true}, '4' : {id: '4', isPresent: true}, '5' : {id: '5', isPresent: true}, } const isPresentArr = ['1','5'] const result = isPresentArr?.map(id => carMap[id]).filter(Boolean); // 输出:[{id: '1', isPresent: true}, {id: '5', isPresent: true}]
方法2:reduce一次完成
用reduce遍历数组,直接构建目标数组,省去额外的filter步骤:
const result = isPresentArr?.reduce((acc, id) => { const car = carMap[id]; if (car) acc.push(car); return acc; }, []);
这两种方法都没有使用for循环或forEach,完全符合需求。
内容的提问来源于stack exchange,提问作者soap_mctavish
相关产品推荐
相关产品推荐

