在前端数据处理场景中,扁平列表分块并转换为JSON结构是高频需求,比如将商品列表按每页10条拆分后生成带分页信息的JSON,或者将用户列表按部门分组后生成层级结构。下面介绍几种高效的实现方式。

基础分块转换实现
最基础的实现逻辑是先对扁平列表进行分块,再将分块后的数组转换为目标JSON结构。核心是使用slice方法截取数组片段,再拼接成需要的格式。
// 扁平列表数据
const flatList = [
{ id: 1, name: '商品A', price: 100 },
{ id: 2, name: '商品B', price: 200 },
{ id: 3, name: '商品C', price: 150 },
{ id: 4, name: '商品D', price: 300 },
{ id: 5, name: '商品E', price: 120 }
];
/**
* 将扁平列表分块并转换为JSON结构
* @param {Array} list 扁平列表
* @param {Number} chunkSize 每块大小
* @returns {Object} 转换后的JSON结构
*/
function chunkListToJSON(list, chunkSize) {
// 处理边界情况
if (!Array.isArray(list) || chunkSize <= 0) {
return { total: 0, chunks: [] };
}
const chunks = [];
// 循环分块
for (let i = 0; i < list.length; i += chunkSize) {
const chunk = list.slice(i, i + chunkSize);
chunks.push(chunk);
}
return {
total: list.length,
chunkSize: chunkSize,
chunkCount: chunks.length,
chunks: chunks
};
}
// 调用示例:每2条为一块
const result = chunkListToJSON(flatList, 2);
console.log(result);
按指定字段分组的转换实现
如果需要按照某个字段的值对扁平列表分组,再转换为嵌套JSON结构,可以结合reduce方法实现,这种方式比循环嵌套更简洁。
// 带分组的扁平列表
const userList = [
{ id: 1, name: '张三', department: '技术部' },
{ id: 2, name: '李四', department: '技术部' },
{ id: 3, name: '王五', department: '产品部' },
{ id: 4, name: '赵六', department: '产品部' },
{ id: 5, name: '孙七', department: '运营部' }
];
/**
* 按指定字段分组并转换为JSON结构
* @param {Array} list 扁平列表
* @param {String} groupKey 分组字段名
* @returns {Object} 分组后的JSON结构
*/
function groupListToJSON(list, groupKey) {
if (!Array.isArray(list) || !groupKey) {
return { groups: [] };
}
// 使用reduce分组
const groupMap = list.reduce((acc, item) => {
const key = item[groupKey];
if (!acc[key]) {
acc[key] = [];
}
acc[key].push(item);
return acc;
}, {});
// 转换为数组格式
const groups = Object.keys(groupMap).map(key => ({
groupName: key,
count: groupMap[key].length,
items: groupMap[key]
}));
return {
total: list.length,
groupCount: groups.length,
groups: groups
};
}
// 调用示例:按department字段分组
const groupResult = groupListToJSON(userList, 'department');
console.log(groupResult);
性能优化建议
处理大规模扁平列表时,需要注意性能问题,以下是几个优化方向:
- 避免在循环中进行不必要的数组拷贝,
slice方法本身会返回新数组,若数据量极大可考虑用索引直接访问 - 分组场景优先使用
reduce而不是多层for循环,减少临时变量的创建 - 如果分块后不需要修改原数组,可复用分块结果,避免重复计算
- 处理超大数据时(比如10万条以上),可考虑使用Web Worker在后台线程处理,避免阻塞主线程
边界情况处理
实际开发中需要处理各种边界情况,保证函数的健壮性:
- 输入不是数组时,返回默认空结构,避免报错
- 分块大小为0或负数时,直接返回空分块
- 扁平列表为空时,返回对应的空JSON结构
- 分组字段不存在时,可将无该字段的项归为默认分组
// 边界情况处理优化版分块函数
function safeChunkListToJSON(list, chunkSize) {
// 输入校验
if (!Array.isArray(list)) {
console.warn('输入不是有效数组');
return { total: 0, chunks: [] };
}
if (typeof chunkSize !== 'number' || chunkSize <= 0) {
console.warn('分块大小无效');
return { total: list.length, chunks: [list] };
}
if (list.length === 0) {
return { total: 0, chunks: [] };
}
const chunks = [];
for (let i = 0; i < list.length; i += chunkSize) {
chunks.push(list.slice(i, i + chunkSize));
}
return {
total: list.length,
chunkSize: chunkSize,
chunkCount: chunks.length,
chunks: chunks
};
}
JavaScript扁平列表分块JSON结构转换数组操作修改时间:2026-07-12 02:39:25