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