为了账号安全,请及时绑定邮箱和手机立即绑定

如何遍历复杂的 Json 对象并对每个等于某个值的属性执行某些操作

如何遍历复杂的 Json 对象并对每个等于某个值的属性执行某些操作

慕哥9229398 2021-06-04 14:47:43
我遇到了以下问题,我需要遍历一个大的 Json 对象(子节点由数组、字符串和对象组成,就嵌套属性而言,深度至少为 4-5 层)。在大 Json 文件的某些部分有一个特定的对象结构,它有一个名为“erpCode”的属性。我需要扫描 Json 并找到具有该属性的所有对象,取值使用该代码向不同的 API 询问详细信息,一旦我获得详细信息,将它们插入到具有当前“erpCode”的对象中。只是为了澄清,在我的情况下,Json 中的父节点属性名称始终等于与 erpCode 属性位于同一“级别”的“typeSysname”字段中的值。一个简单的例子:{   "cars": [    {      "name": "X222",      "carType": {         "erpCode": "skoda",         "value": null,         "typeSysName": "carType"       }    }    ],    "model": {       "year": 1999,       "details": {           "erpCode": "112"           "value": null,           "typeSysName": "details"        }      } }在此示例中,我需要找到 2 个属性,从中获取值 skoda 和 112,并从不同的 API 获取值和描述数据,并将其设置到此 Json 中的正确位置。PS 有没有一个好的 npm 包可以帮助我解决这个问题?
查看完整描述

3 回答

?
九州编程

TA贡献1785条经验 获得超4个赞

mb 类似的东西;


function processObject(jsonData) {

    for (prop in jsonData) {

        if (jsonData.hasOwnProperty(prop)) {

            // We get our prop

            if (prop === 'code') {

                let codeValue = jsonData[prop]

                doSomeAsync(codeValue)

                    .then(response => {

                        jsonData[prop] = response;

                    })

            }

            let curValue = jsonData[prop];

            if (Array.isArray(curValue)) {

                // Loop through the array, if array element is an object, call processObject recursively.

                processArray(curValue);

            } else if (typeof curValue === 'object') {

                processObject(curValue);

            }

        }

    }

}


查看完整回答
反对 回复 2021-06-11
?
MM们

TA贡献1886条经验 获得超2个赞

我以 Aravindh 的答案为起点,并设法达成了一个看似完整的解决方案。我会在这里分享,


async function convertErpCodes(jsonData, orgName, parentPropertyName){    

        for (let prop in jsonData) {

          if (jsonData.hasOwnProperty(prop)) {

              if (prop === 'erpCode') {

                  const erpCodeValue = jsonData[prop]

                  const req = {"query": {"erpCode": erpCodeValue, "orgName": orgName, "typeSysName": parentPropertyName}};

                  const result = await viewLookupErpService.findOne(req);

                  if(result)

                    return result; 

              }

              const curValue = jsonData[prop];

              if (Array.isArray(curValue)) {

                  for(let i in curValue){

                    const res = await convertErpCodes(curValue[i], orgName, prop);

                  }

              } else if (curValue && typeof curValue === 'object') {

                const response = await convertErpCodes(curValue, orgName, prop);

                if(response){

                    jsonData[prop] = response;

                }

              }

          }

      }

}

PS 我只有在从第三方 API 得到响应时才设置这些值(这是递归中结果和响应逻辑的原因。


查看完整回答
反对 回复 2021-06-11
  • 3 回答
  • 0 关注
  • 267 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信