簡體   English   中英

如何使用對象中的鍵映射對象

[英]How to map an object with the keys from an object

我有這個 json 數組:

const cars = {
    "type": "{{TYPE_OF_RECORDS}}",
    "characteristic": "{{CHARACTERISTICS}}",
    "generation": "{{GENERATION}}",
    "records": [
        {
            "name": "{{CAR_NAME_1}}",
            "colors": [
                {
                    "color": "{{CAR_COLOR_1}}",
                    "types": ["{{TYPE_1_A}}", "{{TYPE_1_B}}", "{{TYPE_1_C}}"]
                },
                {
                    "color": "{{CAR_COLOR_2}}",
                    "types": ["{{TYPE_2_A}}", "{{TYPE_2_B}}", "{{TYPE_2_C}}"]
                }
            ]
        },
        {
            "name": "{{CAR_NAME_2}}",
            "colors": [
                {
                    "color": "{{CAR_COLOR_3}}",
                    "types": ["{{TYPE_3_A}}", "{{TYPE_3_B}}", "{{TYPE_3_C}}"]
                },
                {
                    "color": "{{CAR_COLOR_4}}",
                    "types": ["{{TYPE_4_A}}", "{{TYPE_4_B}}", "{{TYPE_4_C}}"]
                }
            ]
        }
    ]
};

如您所見, {{}}后面跟着值。 我需要通過另一個具有相同鍵的對象將值映射到這些標簽上。

具有標記值的對象:

const tagValues = {
    "CAR_NAME_1": "Toyota",
    "CAR_COLOR_1": "Red",
    "TYPE_1_A": "Light",
    "CHARACTERISTICS": "Mechanical",
    "GENERATION": "5th",
    "TYPE_1_B": "Medium",
    "TYPE_1_C": "Dark",
    "CAR_COLOR_2": "Blue",
    "TYPE_2_A": "Medium",
    "TYPE_2_B": "Ultra light",
    "TYPE_OF_RECORDS": "Cars",
    "TYPE_2_C": "Super dark",
    "CAR_NAME_2": "Honda",
    "CAR_COLOR_3": "Black",
    "TYPE_3_A": "Dark",
    "TYPE_3_B": "Ultra light",
    "TYPE_3_C": "light",
    "CAR_COLOR_4": "White",
    "TYPE_4_A": "Light",
    "TYPE_4_B": "Soft Dark",
    "TYPE_4_C": "Dark medium",
};

現在你可以看到這個對象包含這些標簽的所有值。

將這些標簽映射到原始數組的最佳方法是什么?

預期響應:

{
    "type": "Cars",
    "characteristic": "Mechanical",
    "generation": "5th",
    "records": [
        {
            "name": "Toyota",
            "colors": [
                {
                    "color": "Red",
                    "types": ["Light", "Medium", "Dark"]
                },
                {
                    "color": "Blue",
                    "types": ["Medium", "Ultra light", "Super dark"]
                }
            ]
        },
        {
            "name": "Honda",
            "colors": [
                {
                    "color": "Black",
                    "types": ["Dark", "Ultra light", "light"]
                },
                {
                    "color": "White",
                    "types": ["Light", "Soft Dark", "Dark medium"]
                }
            ]
        }
    ]
};

現在我到目前為止所嘗試的是完全錯誤的,因為我不知道如何處理這個,因為在這里我們不確定我們可以有多少嵌套對象或數組。 將來可能會達到第n級。 所以在這里我需要一個不需要擔心對象結構的解決方案。

 const cars = { "type": "{{TYPE_OF_RECORDS}}", "characteristic": "{{CHARACTERISTICS}}", "generation": "{{GENERATION}}", "records": [ { "name": "{{CAR_NAME_1}}", "colors": [ { "color": "{{CAR_COLOR_1}}", "types": ["{{TYPE_1_A}}", "{{TYPE_1_B}}", "{{TYPE_1_C}}"] }, { "color": "{{CAR_COLOR_2}}", "types": ["{{TYPE_2_A}}", "{{TYPE_2_B}}", "{{TYPE_2_C}}"] } ] }, { "name": "{{CAR_NAME_2}}", "colors": [ { "color": "{{CAR_COLOR_3}}", "types": ["{{TYPE_3_A}}", "{{TYPE_3_B}}", "{{TYPE_3_C}}"] }, { "color": "{{CAR_COLOR_4}}", "types": ["{{TYPE_4_A}}", "{{TYPE_4_B}}", "{{TYPE_4_C}}"] } ] } ] }; const tagValues = { "CAR_NAME_1": "Toyota", "CAR_COLOR_1": "Red", "TYPE_1_A": "Light", "CHARACTERISTICS": "Mechanical", "GENERATION": "5th", "TYPE_1_B": "Medium", "TYPE_1_C": "Dark", "CAR_COLOR_2": "Blue", "TYPE_2_A": "Medium", "TYPE_2_B": "Ultra light", "TYPE_OF_RECORDS": "Cars", "TYPE_2_C": "Super dark", "CAR_NAME_2": "Honda", "CAR_COLOR_3": "Black", "TYPE_3_A": "Dark", "TYPE_3_B": "Ultra light", "TYPE_3_C": "light", "CAR_COLOR_4": "White", "TYPE_4_A": "Light", "TYPE_4_B": "Soft Dark", "TYPE_4_C": "Dark medium", }; const finalObj = {}; for(var key in cars){ console.log(cars[key]); finalObj[key] = cars[key].replace('{{' + cars[key] + '}}', tagValues[cars[key]]); }

你需要寫一個遞歸的解決方案,像這樣

 const cars = {"type": "{{TYPE_OF_RECORDS}}","characteristic": "{{CHARACTERISTICS}}","generation": "{{GENERATION}}","records": [{"name": "{{CAR_NAME_1}}","colors": [{"color": "{{CAR_COLOR_1}}","types": ["{{TYPE_1_A}}", "{{TYPE_1_B}}", "{{TYPE_1_C}}"]},{"color": "{{CAR_COLOR_2}}","types": ["{{TYPE_2_A}}", "{{TYPE_2_B}}", "{{TYPE_2_C}}"]}]},{"name": "{{CAR_NAME_2}}","colors": [{"color": "{{CAR_COLOR_3}}","types": ["{{TYPE_3_A}}", "{{TYPE_3_B}}", "{{TYPE_3_C}}"]},{"color": "{{CAR_COLOR_4}}","types": ["{{TYPE_4_A}}", "{{TYPE_4_B}}", "{{TYPE_4_C}}"]}]}]}; const tagValues = {"CAR_NAME_1": "Toyota","CAR_COLOR_1": "Red","TYPE_1_A": "Light","CHARACTERISTICS": "Mechanical","GENERATION": "5th","TYPE_1_B": "Medium","TYPE_1_C": "Dark","CAR_COLOR_2": "Blue","TYPE_2_A": "Medium","TYPE_2_B": "Ultra light","TYPE_OF_RECORDS": "Cars","TYPE_2_C": "Super dark","CAR_NAME_2": "Honda","CAR_COLOR_3": "Black","TYPE_3_A": "Dark","TYPE_3_B": "Ultra light","TYPE_3_C": "light","CAR_COLOR_4": "White","TYPE_4_A": "Light","TYPE_4_B": "Soft Dark","TYPE_4_C": "Dark medium"}; function getObj(obj) { if (Array.isArray(obj)) { for (let i = 0; i < obj.length; i++) { // if value is string replace directly if (typeof obj[i] === 'string') { obj[i] = tagValues[obj[i].replaceAll('{', '').replaceAll('}', '')] || i } // go recursively in case of other values else { getObj(obj[i]) } } } else { for (let key in obj) { // if value is string replace directly if (typeof obj[key] === 'string') { obj[key] = tagValues[obj[key].replaceAll('{', '').replaceAll('}', '')] || obj[key] } // go recursively in case of other values else { getObj(obj[key]) } } } return obj } console.log(getObj(cars))

 const cars = { "type": "{{TYPE_OF_RECORDS}}", "characteristic": "{{CHARACTERISTICS}}", "generation": "{{GENERATION}}", "records": [{ "name": "{{CAR_NAME_1}}", "colors": [{ "color": "{{CAR_COLOR_1}}", "types": ["{{TYPE_1_A}}", "{{TYPE_1_B}}", "{{TYPE_1_C}}"] }, { "color": "{{CAR_COLOR_2}}", "types": ["{{TYPE_2_A}}", "{{TYPE_2_B}}", "{{TYPE_2_C}}"] } ] }, { "name": "{{CAR_NAME_2}}", "colors": [{ "color": "{{CAR_COLOR_3}}", "types": ["{{TYPE_3_A}}", "{{TYPE_3_B}}", "{{TYPE_3_C}}"] }, { "color": "{{CAR_COLOR_4}}", "types": ["{{TYPE_4_A}}", "{{TYPE_4_B}}", "{{TYPE_4_C}}"] } ] } ] }; const tagValues = { "CAR_NAME_1": "Toyota", "CAR_COLOR_1": "Red", "TYPE_1_A": "Light", "CHARACTERISTICS": "Mechanical", "GENERATION": "5th", "TYPE_1_B": "Medium", "TYPE_1_C": "Dark", "CAR_COLOR_2": "Blue", "TYPE_2_A": "Medium", "TYPE_2_B": "Ultra light", "TYPE_OF_RECORDS": "Cars", "TYPE_2_C": "Super dark", "CAR_NAME_2": "Honda", "CAR_COLOR_3": "Black", "TYPE_3_A": "Dark", "TYPE_3_B": "Ultra light", "TYPE_3_C": "light", "CAR_COLOR_4": "White", "TYPE_4_A": "Light", "TYPE_4_B": "Soft Dark", "TYPE_4_C": "Dark medium", }; for (let prop in cars) { let value; if (typeof cars[prop] === 'string') { value = cars[prop].replaceAll('{', '').replaceAll('}', ''); cars[prop] = tagValues[value]; } else { cars[prop].map((e, i, arr) => { for (let prop1 in e) { if (typeof e[prop1] === 'string') { value = e[prop1].replaceAll('{', '').replaceAll('}', ''); e.name = tagValues[value]; } else { e[prop1].map((e) => { for (let prop2 in e) { if (typeof e[prop2] === 'string') { value = e[prop2].replaceAll('{', '').replaceAll('}', ''); e.color = tagValues[value]; } else { e[prop2].map((e, i, arr) => { if (typeof e === 'string') { value = e.replaceAll('{', '').replaceAll('}', ''); arr[i] = tagValues[value]; } }) } } }) } } }) } } console.log(cars);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM