JavaScript if语句中能否使用map/filter?附数组placeId提取代码修复
问题解答
JavaScript中完全可以在if语句中使用map、filter等数组方法,你的代码运行不符合预期是写法存在多处错误,和语法限制无关。
原代码存在的错误
- 变量名拼写错误:函数入参名为
place,函数内部误写为不存在的变量plaecs,运行时会直接抛出引用错误。 - 条件判断逻辑完全错误:
Array.map()的返回值是和原数组等长的新数组,JavaScript中所有数组(哪怕是空数组、内部全是false值的数组)在条件判断中都会被判定为真值,所以你的第一个if分支永远会触发,永远走不到else分支。另外判断「数组中是否存在符合条件的项」应该使用Array.some():该方法遍历数组时只要找到一个符合条件的元素就会返回true,所有元素都不符合才返回false,正好匹配存在性判断的需求。 - 过滤逻辑不严谨:第一个分支过滤条件写的是
type !== 'CONTAINER',如果数组中存在既不是BOX也不是CONTAINER的其他类型项,会被错误保留,直接指定过滤条件为type === 'BOX'更贴合需求,不会出现逻辑漏洞。 - 返回值不符合要求:过滤完成后直接返回了整个对象,没有提取需求要求的
placeId字段,需要在过滤后调用map()提取对应字段。 - 测试代码语法错误:同一作用域下重复用
const声明同名变量place,会直接抛出语法错误。
修复后的可运行代码
function solution(place) { // 判断数组中是否存在BOX类型的项 const hasBox = place.some(item => item.type === 'BOX') if (hasBox) { // 存在BOX时,过滤所有BOX项并提取placeId return place.filter(item => item.type === 'BOX').map(item => item.placeId) } else { // 不存在BOX时,过滤所有CONTAINER项并提取placeId return place.filter(item => item.type === 'CONTAINER').map(item => item.placeId) } } // 测试用例1 const place1 = [ {type: "CONTAINER", placeId: 252 } ] console.log(solution(place1)) // 输出 [252],符合预期 // 测试用例2 const place2 = [ {type: "CONTAINER", placeId: 252 }, {type: "BOX", placeId: 257}, {type: "BOX", placeId: 258} ] console.log(solution(place2)) // 输出 [257, 258],符合预期
逻辑说明
- 用
some()做存在性判断性能更优:不需要遍历完所有数组元素,找到第一个符合条件的BOX项就会停止遍历返回结果。 - 分支逻辑简化:需求中只有「存在BOX」和「不存在BOX」两种互斥场景,不需要额外写else if判断,减少冗余代码。
- 过滤条件直接匹配目标类型,避免其他类型数据干扰返回结果。
内容的提问来源于stack exchange,提问作者user15322469
相关产品推荐
相关产品推荐

