function flattenObject(obj, parentKey = '', result = []) {
for (const key in obj) {
const currentKey = parentKey ? `${parentKey}.${key}` : key;
if (Array.isArray(obj[key])) {
// 处理数组
obj[key].forEach((item, index) => {
const newItem = {};
// 复制父级属性
for (const parentProp in obj) {
if (parentProp !== key && !Array.isArray(obj[parentProp])) {
if (typeof obj[parentProp] === 'object') {
Object.assign(newItem, obj[parentProp]);
} else {
newItem[parentProp] = obj[parentProp];
}
}
}
// 合并当前项属性
Object.assign(newItem, item);
result.push(newItem);
});
} else if (typeof obj[key] === 'object' && obj[key] !== null) {
// 递归处理嵌套对象
flattenObject(obj[key], currentKey, result);
} else {
// 基础类型值直接保留在父级
// if (!result[0]) result.push({});
// result[0][currentKey] = obj[key];
}
}
return result;
}
// 使用示例
const input = {'收入计划': {'合同名称': '房屋租赁合同',
'合同客户名称': '陈开颖',
'合同总金额': 81000,
'合同所在公司': '',
'合同承办人': '',
'合同签订部门': '',
'合同编码': 'ZJHAA2419944AGN00',
'周期性收入计划': [{'业务类型': '',
'产品名称': '房屋出租',
'产品收入项': '',
'产品编码': '',
'利润中心': '',
'单价': 26000,
'发票种类': '增值税专用发票',
'对方名称': '陈开颖',
'序号': 1,
'折扣率': '',
'收入触发系统': '',
'数量': 1,
'是否网元开通': '',
'省端产品名称': '',
'省端产品编码': '',
'确认金额(不含税)': null,
'确认金额(含税)': 26000,
'税率': '',
'税目': '',
'终止日期': '2025-08-31',
'起始日期': '2024-09-01',
'速率/带宽': '',
'频率月': 12}]},
'收款计划': {'收款方式': '非周期性',
'非周期性收款计划': [{'付款延展期限': '',
'实际里程碑日期': '',
'对方名称': '陈开颖',
'履行要求': '首期租金',
'序号': 1,
'收款触发系统': '',
'第N次': '第1次',
'约定收款比例': '',
'约定收款金额': 26000.0,
'计划状态': '',
'里程碑节点': '',
'预计收款日期': '2024-09-08',
'预计里程碑日期': ''},
{'付款延展期限': '',
'实际里程碑日期': '',
'对方名称': '陈开颖',
'履行要求': '合同款',
'序号': 2,
'收款触发系统': '',
'第N次': '第2次',
'约定收款比例': '',
'约定收款金额': 27000.0,
'计划状态': '',
'里程碑节点': '',
'预计收款日期': '2025-08-15',
'预计里程碑日期': ''},
{'付款延展期限': '',
'实际里程碑日期': '',
'对方名称': '陈开颖',
'履行要求': '合同款',
'序号': 3,
'收款触发系统': '',
'第N次': '第3次',
'约定收款比例': '',
'约定收款金额': 28000.0,
'计划状态': '',
'里程碑节点': '',
'预计收款日期': '2026-08-15',
'预计里程碑日期': ''}]}};
const output = {
收入计划: flattenObject(input.收入计划),
收款计划: flattenObject(input.收款计划)
};
console.log(output);