JavaScript中filter与map结合处理selected最大值的逻辑调整需求
解决方案:根据最大值项的占比动态决定过滤逻辑
我明白你的问题了——你需要的逻辑是:只有当数组中存在非最大值的有效项时,才移除最大值项;如果所有有效项都是最大值,就全部保留。原代码的问题在于不管情况如何直接移除所有最大值项,导致全是最大值时返回空数组,不符合预期。
这里有个简洁的实现思路:
- 先提前过滤掉
absent不为0的项,避免重复计算; - 计算有效项中的
selected最大值; - 判断有效项中是否存在不等于最大值的项:
- 如果存在,就过滤掉所有最大值项;
- 如果不存在(所有项都是最大值),就保留全部有效项。
具体代码实现
// 测试场景1:存在非最大值项 const result_arr1 = [ {selected: 3, absent: 0}, {selected: 4, absent: 0}, {selected: 2, absent: 0} ]; // 测试场景2:所有项都是最大值 const result_arr2 = [ {selected: 4, absent: 0}, {selected: 4, absent: 0}, {selected: 4, absent: 0} ]; function filterMaxItems(arr) { // 第一步:过滤掉absent不为0的项 const validItems = arr.filter(item => !item.absent); if (validItems.length === 0) return []; // 边界情况:没有有效项时返回空 // 第二步:计算有效项中的selected最大值 const maxSelected = Math.max(...validItems.map(item => item.selected)); // 第三步:判断是否存在非最大值的有效项 const hasNonMaxItems = validItems.some(item => item.selected !== maxSelected); // 根据判断结果返回对应数组 return hasNonMaxItems ? validItems.filter(item => item.selected !== maxSelected) : validItems; } // 测试场景1 console.log(filterMaxItems(result_arr1)); // 输出: [{selected: 3, absent: 0}, {selected: 2, absent: 0}] // 测试场景2 console.log(filterMaxItems(result_arr2)); // 输出: [{selected: 4, absent: 0}, {selected: 4, absent: 0}, {selected: 4, absent: 0}]
代码解释
- 提前过滤
validItems:避免后续重复执行filter(item => !item.absent),提升代码效率; - 使用
some()判断非最大值项:some()会在找到第一个符合条件的项后立即停止遍历,比统计总数量更高效; - 三元表达式简化逻辑:替代繁琐的
if-else结构,代码更简洁易读。
这个实现完美覆盖了你提到的两种场景,同时也考虑了“没有有效项”的边界情况,逻辑更健壮。
内容的提问来源于stack exchange,提问作者Wake
相关产品推荐
相关产品推荐

