
在数据处理场景中,我们经常需要根据特定条件对数组进行分组或拆分。本教程关注一个特殊需求:给定一个包含多个javascript对象的数组,以及一个作为分割依据的字段名。我们需要将这个源数组拆分成多个子数组,其核心要求如下:
以下是示例数据及其期望的输出格式:
源数据:
const source = [
{ a:1, b:2, c: true},
{ d:1, e:2 },
{ x:1, y:2 },
{ q:1, s:2, c: true}, // 分割点,包含字段 'c'
{ da:1, eb:2 },
{ aaa:1, bbb:2 },
{ aa:1, bb:2 },
{ xa:1, ya:2 },
{ qa:1, sa:2, c: true} // 分割点,包含字段 'c'
];
const field = 'c';期望输出:
[
[
{ a:1, b:2, c: true},
{ d:1, e:2 },
{ x:1, y:2 },
{ q:1, s:2, c: true}, // 包含在第一个子数组的末尾
],
[
{ 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} // 包含在第二个子数组的末尾
]
]为了实现上述需求,我们可以采用单次遍历的策略,维护一个当前子集和一个最终结果集。
立即学习“Java免费学习笔记(深入)”;
我们使用一个 for 循环遍历源数组 sourceArray 中的每一个对象。
添加当前元素:在每次循环的开始,无论当前对象是否是分割点,都将其添加到 currentSet 中。这是因为即使是分割点,它也总是属于它所结束的那个子集。
currentSet.push(sourceArray[i]);
分割条件判断:这是算法的核心部分。我们需要判断当前对象是否满足作为分割点的条件,并且该分割点不是数组的第一个或最后一个元素。
if (sourceArray[i].hasOwnProperty(fieldName) && i !== 0 && i !== sourceArray.length - 1) {
// 执行分割操作
}执行分割操作:如果上述三个条件都为真,说明我们找到了一个位于数组中间的有效分割点。
output.push(currentSet); // 将当前构建好的子数组添加到结果集中 currentSet = [sourceArray[i]]; // 重置 currentSet,并以当前分割点对象作为新子集的第一个元素
当 for 循环结束后,currentSet 中可能还包含最后一个子数组的元素(从最后一个分割点到数组末尾的所有元素)。我们需要确保这个子数组也被添加到 output 中。
if (currentSet.length > 0) {
output.push(currentSet);
}这个条件判断是必要的,以防源数组为空或所有元素都已经被分割并推入 output。
将上述逻辑封装成一个可复用的函数:
/**
* 根据对象中特定字段的存在性拆分数组为重叠子集。
* 分割点对象会同时包含在它所结束的子集和它所开始的子集中。
*
* @param {Array<Object>} sourceArray - 待拆分的源对象数组。
* @param {string} fieldName - 用于判断分割的字段名。
* @returns {Array<Array<Object>>} - 包含重叠子集的数组。
*/
function splitArrayByField(sourceArray, fieldName) {
const output = [];
let currentSet = [];
for (let i = 0; i < sourceArray.length; i++) {
// 1. 总是将当前元素添加到 currentSet
currentSet.push(sourceArray[i]);
// 2. 检查当前对象是否包含指定字段,并且它不是数组的第一个元素也不是最后一个元素
if (
sourceArray[i].hasOwnProperty(fieldName) &&
i !== 0 &&
i !==以上就是JavaScript:根据对象特定字段拆分数组为重叠子集的高级技巧的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号