复杂类型的深度判断

512 阅读1分钟

原数据

  const obj = {
      "textA":32,
      "textB":[
        {
          "1":"22"
        },
      ],
      "textC":[1,2,3],
      "textD":{
          "textD-1":["数量"],
          "textD-2":[
              {"name":"农副食品加工业","data":["2"]},
              {"name":"水的生产和供应业","data":["1"]}
              ],
          "textD-3":{
              "demo": [11],
              "test": 22
          }
      },
      "textE": "textE",
      "textF": true,
      "textH": [[1],[{2:{1:[{2:[1]}]}}],[3]]
      }

处理方法 进行深度递归

const fomatterData = data => {
  const result = {};
  for (let key in data) {
    const type = judgeType(data[key]);
    if (type !== "Object" && type !== "Array") {
      result[key] = type;
    } else if(type === "Array"){
        const res = formatterDeepArray(data[key])
        result[key] = res
    }else{
        result[key] = fomatterData(data[key])
    }
  }
  return result
};

准确判断类型

const judgeType = data => {
  const res = Object.prototype.toString.call(data);
  return /^\[object (.*)\]$/.exec(res)[1];
};

处理类型为数据时候的递归

const formatterDeepArray = (data)=>{
    let result
    if(data.length === 0) {
        result = "any"
    } else{
        result = []
        data.map((i)=>{
            const type = judgeType(i)
            if (type !== "Object" && type !== "Array") {
                result.push(`${type}`)
            } else if(type === "Array"){
                result.push(formatterDeepArray(i))
            }else{
                result.push(fomatterData(i))
            }
        })
    }
    return result
}

结果

{
  "textA": "Number",
  "textB": [
    {
      "1": "String"
    }
  ],
  "textC": [
    "Number",
    "Number",
    "Number"
  ],
  "textD": {
    "textD-1": [
      "String"
    ],
    "textD-2": [
      {
        "name": "String",
        "data": [
          "String"
        ]
      },
      {
        "name": "String",
        "data": [
          "String"
        ]
      }
    ],
    "textD-3": {
      "demo": [
        "Number"
      ],
      "test": "Number"
    }
  },
  "textE": "String",
  "textF": "Boolean",
  "textH": [
    [
      "Number"
    ],
    [
      {
        "2": {
          "1": [
            {
              "2": [
                "Number"
              ]
            }
          ]
        }
      }
    ],
    [
      "Number"
    ]
  ]
}