迭代遍历对象,获取指定属性及其子元素

在 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

posted @ 2018-02-03 14:11  xianshenglu  阅读(320)  评论(0编辑  收藏  举报