将传给后端的数据转换为以formData的类型传递

javascript 复制代码
export function tranFormData(params) {
    console.log('tranFormData---------------', params);

    // 检查输入是否已经是 FormData,如果是,则直接返回
    if (params instanceof FormData) {
        return params;
    }

    const formData = new FormData();

    /**
     * 递归函数,用于将数据添加到 FormData 中
     * @param {string} key - 当前处理的数据的键
     * @param {*} value - 当前处理的数据的值
     */
    const appendToFormData = (key, value) => {
        // 如果值是文件或 Blob 对象的数组,则直接追加
        if (
            Array.isArray(value) &&
            value.some(
                (file) =>
                (file instanceof File) || (file instanceof Blob)
            )
        ) {
            value.forEach((file) => {
                formData.append(key, file);
            });
            return;
        }

        // 如果值是数组,则递归处理数组中的每个元素
        if (Array.isArray(value)) {
            if (value.length === 0) {
                formData.append(`${key}[]`, ''); // 处理空数组的情况
            } else {
                value.forEach((item, index) => {
                    // 递归调用,处理数组中的每个元素
                    appendToFormData(`${key}[${index}]`, item);
                });
            }
            return;
        }

        // 如果值是对象(但不是 File 或 Blob),则递归处理对象中的每个键值对
        if (typeof value === 'object' && value !== null && !(value instanceof File) && !(value instanceof Blob)) {
            Object.keys(value).forEach((objKey) => {
                if (value[objKey] !== null) {
                    // 递归调用,处理对象中的每个属性
                    appendToFormData(`${key}.${objKey}`, value[objKey]);
                }
            });
            return;
        }

        // 对于所有其他基本类型(字符串、数字、布尔值)以及 File 和 Blob 对象,直接追加
        if (value !== null) {
            formData.append(key, value);
        }
    };

    // 遍历初始参数对象的每个键,并开始递归处理
    Object.keys(params).forEach((key) => {
        appendToFormData(key, params[key]);
    });

    return formData;
}
相关推荐
我送炭你添花几秒前
Python与串口:从基础到实际应用——以Pelco KBD300A模拟器项目为例
开发语言·python·自动化·运维开发
鹏多多1 分钟前
jsx/tsx使用cssModule和typescript-plugin-css-modules
前端·vue.js·react.js
No0d1es1 分钟前
2025年12月 GESP CCF编程能力等级认证C++八级真题
开发语言·c++·青少年编程·gesp·ccf
hqwest20 分钟前
码上通QT实战10--监控页面02-绘制温度盘
开发语言·qt·自定义控件·qwidget·提升部件·qt绘图
m0_6265352028 分钟前
快速排序学习 l方法 h方法
开发语言·python
superman超哥40 分钟前
Rust String与&str的内部实现差异:所有权与借用的典型案例
开发语言·后端·rust·rust string·string与str·内部实现·所有权与借用
xiaowu08041 分钟前
C#调用 C++ DLL 加载地址方式选择
开发语言·c++·c#
ssshooter1 小时前
复古话题:Vue2 的空格间距切换到 Vite 后消失了
前端·vue.js·面试
IamZJT_1 小时前
拒绝做 AI 的“饲养员” ❌:前端程序员在 AI 时代的生存与进化指南 🚀
前端·ai编程
非凡ghost1 小时前
MPC-QT视频播放器(基于Qt框架播放器)
开发语言·windows·qt·音视频·软件需求