In js, how to get the specified depth field of json, when undefine, the type default value is zero

Type zero

// 各个类型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 ''
 }

Does the structure contain a field

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

Get a certain value, when the value is undefine, take the type zero value

// Get the value of data
// When data is undefine or null, return the type zero value, otherwise return data
// data is the value, vtype is the type declaration

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

Get the value of the specified field chain, or zero if it does not exist

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

test:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </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>

Output result:
Insert picture description here

Guess you like

Origin blog.csdn.net/fwhezfwhez/article/details/107236003