同步变量迭代器

该文章发布于 ,归类于 Javascript

经常有这样的一种情况,当处理接口数据时,由于返回数据的不确定性,有时某些属性并不存在,比如如下的对象

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')正确输出了leevareget(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' } }

相关文章