javascript:从另一个 json 对象中获取默认值 - 以不同的排序顺序处理数组

标签 javascript node.js

我收到一个 json 作为参数,并且我还有一个模板基础 json。我需要检查模板 json 的所有对象是否都应存在于 tgt json 中,如果没有,则需要使用模板 json 初始化这些变量。

以下是我的实现。

var jsonBase = {  
  "Et":"Val_Retain",
  "A1": {    
      "A12": {
          "A12Array": [              
            {
                  "key1": "val1"
            },
            {
                 "key2": "val2"                   
            }
          ]
        }
      }
    }

var jsonTgt = {  
  "Et":"OldVal",
  "A1": {    
      "A12": {
          "A12Array": [              
            {
                  "key1": "val1Old_Retain"
            }            
          ]
        }
      }
    }

initKeys(jsonBase,jsonTgt)
function initKeys(obj,tgt) {   
    Object.keys(obj).forEach(function(element, key, _array) {        
        var cur;        

        if (typeof(tgt[element])=="undefined") {            
            tgt[element]=obj[element]
        }
        if (typeof(obj[element])=="object") {
                initKeys(obj[element],tgt[element])
        }
    })    
}

console.log(JSON.stringify(jsonTgt))

输出为:

{
    "Et": "OldVal",
    "A1": {
        "A12": {
            "A12Array": [{
                    "key1": "val1Old_Retain"
                }, {
                    "key2": "val2"
                }
            ]
        }
    }
}

有两个问题:

  • 这是正确的方法吗?或者可能有更有效的方法或 有可用的 js/nodejs 库的更简单的吗?
  • 更重要的是 - 如果数组排序顺序与下面的模板不匹配,我该怎么办。

更改排序顺序

var json2 = {  
  "Et":"OldVal",
  "A1": {    
      "A12": {
          "A12Array": [              
            {
                  "key2": "val1Old_Retain"
            }            
          ]
        }
      }
    }

以上产生以下输出:

{
    "Et": "OldVal",
    "A1": {
        "A12": {
            "A12Array": [{
                    "key2": "val1Old_Retain",
                    "key1": "val1"
                }, {
                    "key2": "val2"
                }
            ]
        }
    }
}

与期望的相反:

{
    "Et": "OldVal",
    "A1": {
        "A12": {
            "A12Array": [{                  
                    "key1": "val1"
                }, {
                    "key2": "val1Old_Retain"
                }
            ]
        }
    }
}

最佳答案

这是我能够制作的第一个示例代码并且它有效,但是,我认为您实现代码的方式是错误的,因为我很确定如果您考虑到功能性,您可以做一些更简单的事情编程方法即those native methods from mdn ,和those ones from lodash library如果我这样做了,请不要忘记标记为已回答,否则请发表评论,以便我获得有关您的确切情况的更多信息

var _ = require('lodash')
let jsonInput = {
    "Et": "Val_Retain",
    "A1": {
        "A12": {
            "A12Array": [{
                "key1": "val1"
            }, {
                "key2": "val2"
            }]
        }
    }
}

let jsonInput2 = {
    "Et": "OldVal",
    "A1": {
        "A12": {
            "A12Array": [{
                "key1": "val1Old_Retain"
            }]
        }
    }
}

for (let key1 in jsonInput) {
    if (key1 === 'Et') {
        jsonInput[key1] = "OldVal"
    } else {
        for (let key2 in jsonInput[key1]) {
            for (let key3 in jsonInput[key1][key2]) {
                console.log(jsonInput[key1][key2][key3])
                let listOfKeys = getKeys(jsonInput[key1][key2][key3])
                console.log(listOfKeys)
                console.log(jsonInput2[key1][key2])
                console.log(key3)
                let listOfKeys2 = getKeys(jsonInput2[key1][key2][key3])
                console.log(listOfKeys2)
                let uniqkeys = _.uniq(listOfKeys.concat(listOfKeys2))
                let sortedUniqkeys = _.sortBy(uniqkeys)
                let result = []
                console.log('sortedUniqkeys', sortedUniqkeys)
                sortedUniqkeys.forEach((key4, i) => {
                    let doc = {}
                    if (listOfKeys2.indexOf(key4) != -1) {
                        jsonInput2[key1][key2][key3].forEach((e, i) => {
                            if (e[key4]) {
                                doc[key4] = e[key4]
                            }
                        })
                    } else {
                        jsonInput[key1][key2][key3].forEach((e, i) => {
                            if (e[key4]) {
                                doc[key4] = e[key4]
                            }
                        })
                    }
                    result.push(doc)
                    console.log(key4, jsonInput[key1][key2][key3][key4])
                    console.log(result)
                })
                jsonInput[key1][key2][key3] = result
            }
        }
    }
}

function getKeys(arr) {
    console.log(arr)
    return arr.reduce(function(accumulator, value, index, array) {
        for (let key3 in value) {
            accumulator.push(key3)
        }
        return accumulator
    }, []);
}

console.log(JSON.stringify(jsonInput))

关于javascript:从另一个 json 对象中获取默认值 - 以不同的排序顺序处理数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43885209/

相关文章:

javascript - 使用 material-ui 时出现 proptypes 错误

javascript - 没有 jQuery UI 的自动完成

javascript - 无法关闭 Google map 中的远足路线图层

javascript - 丢失 HTTP 请求正文

javascript - Angular 子 ng-click 事件在父 ng-click 事件后不会触发

Node.js + Express + simpledb;尝试列出域时出现 "TypeError: Cannot read property ' 错误“null”

javascript - 无法使用 jquery 选择动态生成的选择的第一项

javascript - 根据 Recordset NULL 值隐藏 <TR> 标签

node.js - 如何在浏览器上显示不断更新的文件?

javascript - 错误 : Cannot find module '@discordjs/opus'