【问题标题】:How to create a new merged javascript object based on available keys and user's input如何根据可用键和用户输入创建新的合并 javascript 对象
【发布时间】:2021-12-03 05:31:40
【问题描述】:

如果我有可用的密钥,例如:

[   
    "cars[].model",
    "cars[].make",
    "cars[].year",
    "toys.color",
    "toys.type[].brand",
    "toys.type[].price",
    "id",
    "books[].publisher[].authors[]"
]

其中cars[].model 表示cars 是一个对象数组,其中model 作为键之一。

如果输入是:

{
    "cars": [
        {
            "make": "Audi"
        },
        {
            "model": "A8",
            "year": "2007"
        }
    ],
    "id": "xyz",
    "extra": "test",
    "toys": {
        "color": "Black",
        "type": [
            {
                "price": "$100"
            }
        ]
    }
}

如何根据这些可用键和输入对象创建对象?

目标输出:

{
    "cars": [
        {
            "model": "",
            "make": "Audi",
            "year": ""
        },
        {
            "model": "A8",
            "make": "",
            "year": "2007"
        }
    ],
    "toys": {
        "color": "Black",
        "type": [
            {
                "brand": "",
                "price": "$100"
            }
        ]
    },
    "id": "xyz",
    "books": [
        {
            "publisher": [
                {
                    "authors": []
                }
            ]
        }
    ],
    "extra": "test"
}

如果可用键不存在,则值为空。

我曾尝试展平/取消展平嵌套对象,但徒劳无功。

任何帮助将不胜感激。

【问题讨论】:

    标签: javascript arrays json typescript object


    【解决方案1】:

    这是recursion 的工作。我定义了一个函数addKeysRec,它将添加input数组中缺少的元素:

    function addKeysRec(input, keyArray, recursiveCalls=0) {
        if (recursiveCalls == keyArray.length) return
        const k = keyArray[recursiveCalls]
        if (k == "[]") {
            if (!input.length && recursiveCalls + 1 < keyArray.length) input.push({})
            input.forEach(s => addKeysRec(s, keyArray, recursiveCalls + 1))            
        } else {
            if (!input.hasOwnProperty(k)) {
                if (keyArray[recursiveCalls + 1] == null) input[k] = ''
                else if (keyArray[recursiveCalls + 1] == '[]') input[k] = []
                else input[k] = {}
            }
            addKeysRec(input[k], keyArray, recursiveCalls + 1)
        }
    }
    

    实际作用:

    const keys = [   
        "cars[].model",
        "cars[].make",
        "cars[].year",
        "toys.color",
        "toys.type[].brand",
        "toys.type[].price",
        "id",
        "books[].publisher[].authors[]"
    ]
    
    const input = {
        "cars": [
            {
                "make": "Audi"
            },
            {
                "model": "A8",
                "year": "2007"
            }
        ],
        "id": "xyz",
        "extra": "test",
        "toys": {
            "color": "Black",
            "type": [
                {
                    "price": "$100"
                }
            ]
        }
    }
    
    function addKeysRec(input, keyArray, recursiveCalls=0) {
        if (recursiveCalls == keyArray.length) return
        const k = keyArray[recursiveCalls]
        if (k == "[]") {
            if (!input.length && recursiveCalls + 1 < keyArray.length) input.push({})
            input.forEach(s => addKeysRec(s, keyArray, recursiveCalls + 1))            
        } else {
            if (!input.hasOwnProperty(k)) {
                if (keyArray[recursiveCalls + 1] == null) input[k] = ''
                else if (keyArray[recursiveCalls + 1] == '[]') input[k] = []
                else input[k] = {}
            }
            addKeysRec(input[k], keyArray, recursiveCalls + 1)
        }
    }
    
     keys.forEach(key => {
        keyArray = key.replace(/\[\]/g, '.[]').split(".")
        addKeysRec(input, keyArray)
    })
    
    console.log(input)
    

    输出:

    {
        "cars": [
            {
                "model": "",
                "make": "Audi",
                "year": ""
            },
            {
                "model": "A8",
                "make": "",
                "year": "2007"
            }
        ],
        "toys": {
            "color": "Black",
            "type": [
                {
                    "brand": "",
                    "price": "$100"
                }
            ]
        },
        "id": "xyz",
        "books": [
            {
                "publisher": [
                    {
                        "authors": []
                    }
                ]
            }
        ],
        "extra": "test"
    }
    

    行:

    key = key.replace(/\[\]/g, '.[]').split(".")
    

    是将每个键转换为数组,例如从格式"cars[].model" 转换为["cars", "[]", "model"]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-18
      • 2017-09-11
      • 2018-03-12
      • 1970-01-01
      • 1970-01-01
      • 2020-03-14
      • 1970-01-01
      相关资源
      最近更新 更多