zoukankan      html  css  js  c++  java
  • 迭代遍历对象,获取指定属性及其子元素

    在 SO 上发现一个题目:

    I need to end up with an array of the Branch Codes found in the child Details. Here is the output I'm attempting to get:

    {
      "TITLE": {
        "FirstLevel": {
          "Details": {
            "Code": "01",
          },
          "SecondLevel": [
            {
              "Details": {             
                "Description": "{desc}",          
              },
              "ThirdLevel": {
                "Details": {
                  "Code": "01",
                },
                "FourthLevel": [
                  {
                    "Details": {
                      "Code": "11",
                    },
                    "Branch": {
                      "Details": {
                        "Code": "1000",
                      }
                    }
                  },
                  {
                    "Details": {
                      "Code": "12",
                    },
                    "Branch": [
                      {
                        "Details": {
                          "Code": "1201",
                        }
                      },
                      {
                        "Details": {
                          "Code": "1202",
                        }
                      }
                    ]
                  }
                ]
              }
            },
            {
              "Details": {
                "Code": "100",
              },
              "ThirdLevel": [
                {
                  "Details": {
                    "Code": "02",
                  },
                  "FourthLevel": {
                    "Details": {
                      "Code": "21"
                    },
                    "Branch": {
                      "Details": {
                        "Code": "2101",
                      }
                    }
                  }
                },
                {
                  "Details": {
                    "Code": "03",
                  },
                  "FourthLevel": [
                    {
                      "Details": {
                        "Code": "31",
                      },
                      "Branch": {
                        "Details": {
                          "Code": "3101",
                        }
                      }
                    },
                    {
                      "Details": {
                        "Code": "32",
                      },
                      "Branch": {
                        "Details": {
                          "Code": "3201",
                        }
                      }
                    }
                  ]
                }
              ]
            }
          ]
        }
      }
    }

    考虑下代码,我给出了这样的答案:

    function transData(data, propertyName, path, result = []) {
        
        if (data instanceof Array) {
            data.forEach(obj => transData(obj, propertyName, path, result));
        } else if (data instanceof Object) {
            let existProperty = Object.keys(data).indexOf(propertyName) > -1;
            if (existProperty) {
                getCode(data[propertyName], path, result);
            } else {
                Object.keys(data).forEach(key => transData(data[key], propertyName, path, result));
            }
        }
    
        function getCode(data, path, result) {
            if (data instanceof Array) {
                data.forEach(obj => getCode(obj, path, result));
            } else {
                if (typeof path !== 'undefined') {
                    result.push(path.split(/./g).reduce((accumulator, val) => accumulator = accumulator[val], data));
                } else {
                    result.push(data);
                }
            }
        }
    
        return result;
    }

    如果你 log 下:

    console.log(transData(obj, 'Branch', 'Details.Code'));
    //[ '1000', '1201', '1202', '2101', '3101', '3201' ]
    console.log(transData(obj, 'Branch'));
    /*[ { Details: { Code: '1000' } },
      { Details: { Code: '1201' } },
      { Details: { Code: '1202' } },
      { Details: { Code: '2101' } },
      { Details: { Code: '3101' } },
      { Details: { Code: '3201' } } ]*/

    后来发现这个情况挺普遍的,代码具有移植性,所以就记录下;

    参考:

    How to traverse nested data

  • 相关阅读:
    开源收集
    理财
    MSSQL
    MAC-Python
    设计模式
    数据分析
    wkhtmltopdf是一个使用webkit网页渲染引擎开发的用来将 html转成 pdf的工具
    ETL
    MQ
    Java 资源
  • 原文地址:https://www.cnblogs.com/xianshenglu/p/8409356.html
Copyright © 2011-2022 走看看