Javascript 将对象关键帧从snake case转换为camel case以及从camel case转换为snake case的最佳方法是什么?

Javascript 将对象关键帧从snake case转换为camel case以及从camel case转换为snake case的最佳方法是什么?,javascript,reactjs,performance,object,Javascript,Reactjs,Performance,Object,我收到服务器的响应,其结构如下: { is_separate_page: true, is_blank_page: true, is_instructions_page: false, is_letter_paper: true, is_pressure_seal_paper: false, is_mask_ssn_on_letter_paper: true, is_mask_ssn_on_pressure_seal_paper: true

我收到服务器的响应,其结构如下:

{
    is_separate_page: true,
    is_blank_page: true,
    is_instructions_page: false,
    is_letter_paper: true,
    is_pressure_seal_paper: false,
    is_mask_ssn_on_letter_paper: true,
    is_mask_ssn_on_pressure_seal_paper: true,
    is_pdf_encrypted_on_letter_paper: false,
    is_pdf_encrypted_on_pressure_seal_paper: true
}
然后,我使用以下帮助函数将值转换为camel case语法,以存储在我的React组件状态中:

// Destructuring approach

transformInitialCheckboxesState = data => {
        const {
            is_show_mask_ssn_field: isShowMaskSSNField,
            is_separate_page: isSeparatePage,
            is_blank_page: isBlankPage,
            is_instructions_page: isInstructionsPage,
            is_letter_paper: isLetterPaper,
            is_pressure_seal_paper: isPressureSealPaper,
            is_mask_ssn_on_letter_paper: isMaskSSNonLetterPaper,
            is_mask_ssn_on_pressure_seal_paper: isMaskSSNonPressureSealPaper,
            is_pdf_encrypted_on_letter_paper: isPDFEncryptedOnLetterPaper,
            is_pdf_encrypted_on_pressure_seal_paper: isPDFEncryptedOnPressureSealPaper,
        } = data

        return {
            isShowMaskSSNField,
            isSeparatePage,
            isBlankPage,
            isInstructionsPage,
            isLetterPaper,
            isPressureSealPaper,
            isMaskSSNonLetterPaper,
            isMaskSSNonPressureSealPaper,
            isPDFEncryptedOnLetterPaper,
            isPDFEncryptedOnPressureSealPaper,
        }
    }

对于提交值,我应该执行相反的操作,以便根据后端需求准备密钥:

    preparePayloadCheckboxesState = data => {
        const {
            isShowMaskSSNField: is_show_mask_ssn_field,
            isSeparatePage: is_separate_page,
            isBlankPage: is_blank_page,
            isInstructionsPage: is_instructions_page,
            isLetterPaper: is_letter_paper,
            isPressureSealPaper: is_pressure_seal_paper,
            isMaskSSNonLetterPaper: is_mask_ssn_on_letter_paper,
            isMaskSSNonPressureSealPaper: is_mask_ssn_on_pressure_seal_paper,
            isPDFEncryptedOnLetterPaper: is_pdf_encrypted_on_letter_paper,
            isPDFEncryptedOnPressureSealPaper: is_pdf_encrypted_on_pressure_seal_paper,
        } = data

        return {
            is_show_mask_ssn_field,
            is_separate_page,
            is_blank_page,
            is_instructions_page,
            is_letter_paper,
            is_pressure_seal_paper,
            is_mask_ssn_on_letter_paper,
            is_mask_ssn_on_pressure_seal_paper,
            is_pdf_encrypted_on_letter_paper,
            is_pdf_encrypted_on_pressure_seal_paper,
        }
    }


问题是:在我的观点上,它看起来非常相似且可重复,在你的观点上,减少此代码的最佳和最优雅的方法是什么?

如果你想替换对象的所有字母,并用大写字母替换所有的字母[a-z]。然后使用获取一个新对象

const fn=key=>key.replace/[a-z]/g、m=>m.toUpperCase const reverse_fn=key=>key.replace/[A-Z]/g,m=>`{m.toLowerCase}` //trasnforms基于提供的replacer函数生成一个对象 const trasnform=o,replacer=> Object.fromEntries Object.entrieso.map[k,v]=>[replacerk,v] const input={is_separate_page:true,is_blank_page:true,is_instructions_page:false,is_letter_paper:true,is_pressure_seal_paper:false,is_mask_ssn_on_pressure_paper:true,is_mask_ssn_on_pressure_seal_paper:true,is_pdf_加密__on_pressure_seal_paper:true}, reverseInput={isSeparatePage:true,isBlankPage:true,IsInstructionPage:false,IsLaterPaper:true,isPressureSealPaper:false,isMaskSsnOnLetterPaper:true,isMaskSsnOnPressureSealPaper:true,IsPDEncryptedOnletterPaper:false,IsPDEncryptedOnPressureSealPaper:true}; //正向变换 console.log 传输输入,fn //反变换 console.log TRASNFORM反向输入,反向输入
如果要替换对象的所有u,并用大写字母替换所有的[a-z]。然后使用获取一个新对象

const fn=key=>key.replace/[a-z]/g、m=>m.toUpperCase const reverse_fn=key=>key.replace/[A-Z]/g,m=>`{m.toLowerCase}` //trasnforms基于提供的replacer函数生成一个对象 const trasnform=o,replacer=> Object.fromEntries Object.entrieso.map[k,v]=>[replacerk,v] const input={is_separate_page:true,is_blank_page:true,is_instructions_page:false,is_letter_paper:true,is_pressure_seal_paper:false,is_mask_ssn_on_pressure_paper:true,is_mask_ssn_on_pressure_seal_paper:true,is_pdf_加密__on_pressure_seal_paper:true}, reverseInput={isSeparatePage:true,isBlankPage:true,IsInstructionPage:false,IsLaterPaper:true,isPressureSealPaper:false,isMaskSsnOnLetterPaper:true,isMaskSsnOnPressureSealPaper:true,IsPDEncryptedOnletterPaper:false,IsPDEncryptedOnPressureSealPaper:true}; //正向变换 console.log 传输输入,fn //反变换 console.log TRASNFORM反向输入,反向输入
您可以创建映射对象和变换函数:

const mapping = {
    "is_show_mask_ssn_field" : "isShowMaskSSNField",
    "is_separate_page": "isSeparatePage",
    ... other properties
}

const fromServer = (data) => {
    let obj = {};
    for (var prop in data) {
        var realName = mapping[prop];
        if (realName) {
            obj[realName] = data[prop];
        }
    }
    return obj;
}

const toServer = (data) => {
    let obj = {};
    for (var serverName in mapping) {
        var realName = mapping[serverName];
        if (data.hasOwnProperty(realName)) {
            obj[serverName] = data[realName];
        }
    }
    return obj;
}

因此,在将数据发送到服务器之前,您只需在从端点接收到数据后调用fromServer,然后再调用模型上的toServer即可。

您可以创建映射对象并转换函数:

const mapping = {
    "is_show_mask_ssn_field" : "isShowMaskSSNField",
    "is_separate_page": "isSeparatePage",
    ... other properties
}

const fromServer = (data) => {
    let obj = {};
    for (var prop in data) {
        var realName = mapping[prop];
        if (realName) {
            obj[realName] = data[prop];
        }
    }
    return obj;
}

const toServer = (data) => {
    let obj = {};
    for (var serverName in mapping) {
        var realName = mapping[serverName];
        if (data.hasOwnProperty(realName)) {
            obj[serverName] = data[realName];
        }
    }
    return obj;
}

因此,在将数据发送到服务器之前,您只需在从端点接收到数据后对数据调用fromServer,然后再调用模型上的服务器。

或者,如果您已经对lodash之类的东西有依赖关系,请使用mapKeys。当然,对于相反的情况,k.replace/[a-Z]/g,m=>'.'+m.toLowerCase,如果有任何额外的大写字母,这将不起作用。@ScottSauyet我刚刚补充说:。此外,反向案例计时不需要捕获组!:-是的,关于捕获组,这是正确的。当然,当您尝试使用缩写时,所有这些都会崩溃,例如示例中的_ssn uu到ssn和_pdf u到pdf。但它可以帮助您实现大部分目标。或者,如果您已经依赖于lodash之类的东西,请使用mapKeys。当然,k.replace/[a-Z]/g,m=>“'+m.toLowerCase”用于相反的大小写,如果有任何无关的大写字母,这将不起作用。@ScottSauyet我刚刚添加了这一点:。此外,反向案例计时不需要捕获组!:-是的,关于捕获组,这是正确的。当然,当您尝试使用缩写时,所有这些都会崩溃,例如示例中的_ssn uu到ssn和_pdf u到pdf。但它在大多数情况下都能让你达到目的。请注意,通常情况下,优雅和性能是不相容的。请注意,通常情况下,优雅和性能是不相容的。