JavaScript:基于特定字段拆分对象数组的函数实现问题
修正数组拆分逻辑:让过滤字段元素同时存在于前后集合
问题分析
原代码的问题在于,遇到第一个包含过滤字段的元素时就立即将当前集合加入结果,导致第一个结果集合仅包含该单个元素,不符合预期的「从第一个过滤元素到下一个过滤元素的完整区间」要求。
修正方案
我们可以先收集所有包含过滤字段的元素索引,再根据这些索引拆分出符合要求的区间,确保每个过滤元素同时出现在前一个区间的末尾和后一个区间的开头:
const data = [ { a:1, b:2, c: true}, { d:1, e:2 }, { x:1, y:2 }, { q:1, s:2, c: true}, { da:1, eb:2 }, { aaa:1, bbb:2 }, { aa:1, bb:2 }, { xa:1, ya:2 }, { qa:1, sa:2, c: true} ]; const field = 'c'; const output = []; // 收集所有包含过滤字段的元素索引 const filterIndices = data .map((item, index) => item.hasOwnProperty(field) ? index : -1) .filter(index => index !== -1); if (filterIndices.length === 0) { // 没有过滤元素时,直接返回原数组作为唯一集合 output.push([...data]); } else { // 根据索引拆分区间 filterIndices.forEach((currentIdx, i) => { if (i === filterIndices.length - 1) { // 最后一个区间:从当前索引到数组末尾 output.push(data.slice(currentIdx)); } else { // 中间区间:从当前索引到下一个过滤元素的索引(包含两端) const nextIdx = filterIndices[i + 1]; output.push(data.slice(currentIdx, nextIdx + 1)); } }); } console.log(output);
逻辑说明
- 收集索引:遍历原数组,记录所有包含目标字段的元素位置。
- 处理边界情况:如果没有找到任何过滤元素,直接将原数组作为单个集合返回。
- 拆分区间:
- 对于最后一个过滤索引,截取从该索引到数组末尾的所有元素作为最后一个集合。
- 对于中间的过滤索引,截取从当前索引到下一个过滤索引(包含该索引)的元素,确保当前过滤元素同时出现在当前集合的末尾和下一个集合的开头。
内容的提问来源于stack exchange,提问作者coolsky
相关产品推荐
相关产品推荐

