js里,如何获取json的指定深度的字段,undefine时,取类型默认零值

类型零值

// 各个类型0值的默认值
// vtype取值为字符串,string, int, bool
// 使用示例:
// zeroDefault('string')
function zeroDefault(vtype) {
     switch (vtype) {
       case 'string':case 'varchar':case 'char':
           return ''
       case 'int':case 'number':case 'float':
            return 0
       case 'bool':case 'boolean':
           return false
       case 'struct':case 'object':
           return {}
     }
     return ''
 }

结构体是否包含某个字段

// 判断某个结构体,是否有某个key
// data是{}对象,key是字符串
// 返回bool值
// 使用示例:
// existKey({name: 'ft' class: {'classname': 'et'}}, 'class')
function existKey(data, key) {
    if (data.hasOwnProperty(key)) {
        return true
    }
    return false
}

获取某个值,当值为undefine时,取类型零值

// 获取data的值
// 当data为undefine或者null时,返回类型零值,否则返回data
// data为值,vtype为类型声明

// 使用示例:
// valueOfChain({name: 'ft' class: {'classname': 'et'}}, 'class.classname', 'object')
function valueOf(data, vtype) {
    if (typeof data == 'undefined' || data === null) {
        return zeroDefault(vtype)
    }
    return data
}

获取指定字段链的值,不存在则取零值

// data是{}对象,深度未知
// chain是字符串,格式必须为类似 user_info.class.class_info 这样的链式
// vtype是字符串,取值为string, int, bool
// 使用示例:
// valueOfChain({name: 'ft' class: {'classname': 'et'}}, 'class.classname', 'string')
function valueOfChain(data, chain, vtype) {
   var fields = chain.split('.')
   if (fields.length < 1) {
       return zeroDefault(vtype)
   }
   if (existKey(data, fields[0])) {
       if (fields.length == 1) {
           return valueOf(data[fields[0]])
       } else {
       //   valueOf({classname: 'et'}, 'classname', 'string') 
       // ['classname'].join('.') = 'classname'
	       return valueOfChain(
	           data[fields[0]],
	           fields.slice(1).join('.'),
	           vtype
	       )
     }
   }
   return zeroDefault(vtype)
 }

测试:


<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Documenttitle>
  head>
  <body>
    <script>
      function zeroDefault(vtype) {
        switch (vtype) {
          case 'string':
          case 'varchar':
          case 'char':
            return ''
          case 'int':
          case 'number':
          case 'float':
            return 0
          case 'bool':
          case 'boolean':
            return false
          case 'struct':
          case 'object':
            return {}
        }
      }
      function existKey(data, key) {
        if (data.hasOwnProperty(key)) {
          return true
        }
        return false
      }
      var obj = {
        name: 'maha',
        class: {
            classname: 'et',
            teacher: {
                teacher_name: 'miuze',
                age: 35
            }
        }
      }
      function valueOf(data, vtype) {
        if (typeof data == 'undefined' || data === null) {
          return zeroDefault(vtype)
        }
        return data
      }

       // valueOf({name: 'ft', class: {classname: 'et'}}, 'class.classname', 'string')  = 'et'
      function valueOfChain(data, chain, vtype) {
        var fields = chain.split('.')
        if (fields.length < 1) {
          return zeroDefault(vtype)
        }
        if (existKey(data, fields[0])) {
          if (fields.length == 1) {
            return valueOf(data[fields[0]])
          } else {
            //   valueOf({classname: 'et'}, 'classname', 'string') 
            // ['classname'].join('.') = 'classname'
            return valueOfChain(
              data[fields[0]],
              fields.slice(1).join('.'),
              vtype
            )
          }
        }
        return zeroDefault(vtype)
      }
      console.log('test [zeroDefault]',zeroDefault('int'))
      console.log('test [existKey]', existKey(obj, 'class'))

      console.log('test [valueOf]',valueOf(null, 'int'))
      console.log('test [valueOfChain]',valueOfChain(obj, 'class.teacher.teacher_name', 'string'))
      console.log('test [valueOfChain]',valueOfChain(obj, 'class.teacher.teacher_name2', 'string'))

      console.log('test [valueOfChain]',valueOfChain(obj, 'class.teacher.age', 'number'))
      console.log('test [valueOfChain]',valueOfChain(obj, 'class.teacher.age2', 'number'))
    script>
  body>
html>

输出结果:
在这里插入图片描述

你可能感兴趣的:(js)