编辑代码

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);