我将使用 Lodash 来处理一维数组,将其转换为按 executeProcess
分组的二维数组结构,每个组包含 executeDept
和对应的列表。
const _ = require('lodash');
/**
* 将一维数组转换为按executeProcess分组的二维数组
* @param {Array} arr - 原始一维数组
* @returns {Array} 分组后的二维数组
*/
function transformArray(arr) {
// 使用Lodash的groupBy按executeProcess分组
const grouped = _.groupBy(arr, 'executeProcess');
// 转换为所需的二维数组格式
return _.map(grouped, (items, process) => {
// 取第一个元素的executeDept作为组的executeDept
const executeDept = items[0].executeDept || '';
return {
executeDept: executeDept,
list: items.map(item => {
// 复制原始对象并移除executeProcess和executeDept,保留其他属性
const { executeProcess, executeDept, ...rest } = item;
return rest;
})
};
});
}
// 示例用法
const originalArray = [
{ executeDept: '部门A', executeProcess: '流程1', name: '项目1' },
{ executeDept: '部门A', executeProcess: '流程1', name: '项目2' },
{ executeDept: '部门B', executeProcess: '流程2', name: '项目3' },
{ executeDept: '部门B', executeProcess: '流程2', name: '项目4' },
{ executeDept: '部门C', executeProcess: '流程3', name: '项目5' }
];
const result = transformArray(originalArray);
console.log(result);
代码说明:
- 首先使用
_.groupBy
方法按executeProcess
对原始数组进行分组,将相同executeProcess
的元素归为一组。 - 然后使用
_.map
方法将分组后的对象转换为所需的格式:
- 每个组包含
executeDept
属性,取值为该组第一个元素的executeDept
- 每个组包含
list
属性,该属性是一个数组,包含该组的所有元素 - 每个元素会移除
executeProcess
和executeDept
属性,只保留其他属性
- 示例输入转换后会得到如下结果:
[
{
"executeDept": "部门A",
"list": [{"name": "项目1"}, {"name": "项目2"}]
},
{
"executeDept": "部门B",
"list": [{"name": "项目3"}, {"name": "项目4"}]
},
{
"executeDept": "部门C",
"list": [{"name": "项目5"}]
}
]
这种处理方式确保了相同 executeProcess
的元素被合并到同一个组中,同时保留了 executeDept
信息。