同步变量迭代器
经常有这样的一种情况,当处理接口数据时,由于返回数据的不确定性,有时某些属性并不存在,比如如下的对象
const api = {
code: 0,
data: {
person: {
name: 'leevare',
gender: 'male'
}
}
}
假如接口上返回了上面的这样一段数据,如果想获得name
,通常会这样写api.data.person.name
,但是呢,由于接口有时候返回的data
是空的,所以,当data
为空时,此时api.data.person.name
会报错的,所以为了不报错,要这样写api.data && api.data.person && api.data.person.name
,这样一层又一层的增加了不少安全校验的代码,使代码变的十分臃肿。
为了解决这个问题,可以封装一个函数,采用迭代取值的方式来获取值。
const get = (object, key) => {
if (!object) return undefined
let result = object
key = key.split('.')
for (let i = 0; i < key.length; i++) {
if (result[key[i]] !== undefined) {
result = result[key[i]]
} else {
return undefined
}
}
return result
}
通过不断地迭代对象中指定的key
,从而获得正确的值,如果不存在,将会返回undefined
。
测试一下,get(api, 'data.person.name')
正确输出了leevare
,get(api, 'data.person.test')
输出undefined
。
这样能减少了之前频繁安全检测导致代码冗余的问题。当然,这个还可以扩展,比如,当获取指定的值不存在时,返回默认值。
这是获取属性的值的方法,与之相对,应该还有设置值的方法。同样,也是使用迭代的方式,代码如下:
const set = (obj, key, value) => {
if (!obj) return false
let result = obj
key = key.split('.')
let len = key.length
for (let i = 0; i < len - 1; i++) {
if (result[key[i]] === undefined) {
result[key[i]] = {}
}
if (!(result[key[i]] instanceof Object)) {
throw new Error('obj.' + key.splice(0, i + 1).join('.') + ' is not Object')
}
result = result[key[i]]
}
return result[key[len - 1]] = value
}
测试一下,set(api, 'a.b', 'hello world')
,打印api
返回的结果为
{ code: 0,
data: { person: { name: 'leevare', gender: 'male' } },
a: { b: 'hello world' } }
如果您觉得本文对您有用,欢迎捐赠或留言~
- 本博客所有文章除特别声明外,均可转载和分享,转载请注明出处!
- 本文地址:https://www.leevii.com/?p=1517