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

我遇到了以下问题,


我需要遍历一个大的 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 包可以帮助我解决这个问题?


慕哥9229398
浏览 268回答 3
3回答

九州编程

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);            }        }    }}

MM们

我以 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 得到响应时才设置这些值(这是递归中结果和响应逻辑的原因。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript