一个合并default和外部传入data的方法

50 阅读1分钟

主要作用是: 只要外部传入了key,不管该值是 ‘’ 或者 null 都会按照外部传入值,只有外部没有这个key才会用default的数据, 同时支持嵌套

1693815311619.png


/**
 * When merging defaults and form data, we want to merge in this specific way:
 * - objects are deeply merged
 * - arrays are merged in such a way that:
 *   - when the array is set in form data, only array entries set in form data
 *     are deeply merged; additional entries from the defaults are ignored
 *   - when the array is not set in form data, the default is copied over
 * - scalars are overwritten/set by form data
 */
function mergeDefaultsWithFormData(defaults, formData) {
    if (Array.isArray(formData)) {
        if (!Array.isArray(defaults)) {
            defaults = [];
        }
        return formData.map((value, idx) => {
            if (defaults[idx]) {
                return mergeDefaultsWithFormData(defaults[idx], value);
            }
            return value;
        });
    } if (isObject(formData)) {
        const acc = Object.assign({}, defaults); // Prevent mutation of source object.
        return Object.keys(formData).reduce((preAcc, key) => {
            preAcc[key] = mergeDefaultsWithFormData(
                defaults ? defaults[key] : {},
                formData[key]
            );
            return preAcc;
        }, acc);
    }
    return formData;
}