完成 deepGet 函数,给它传入一个对象和字符串,字符串表示对象深层属性的获取路径,可以深层次获取对象内容:

560 阅读1分钟
const deepGet = (obj, prop) => {
  let keys = prop.split(".").map((i) => i.trim())
  if (!keys) return undefined
  let res = keys.reduce((prev, curr) => {
    let objKey = curr.split("[") // 处理prop形如school[0]时情况
    // 首先判断key是否属于obj的keys
    if (prev && Object.keys(prev).includes(objKey[0])) {
      // 对象键值对中值为数组并且prop形如school[0]时
      if (objKey.length > 1 && Array.isArray(prev[objKey[0]])) {
        let idx = objKey[1].slice(0, -1).trim()
        return prev[objKey[0]][idx]
      } else if (objKey.length > 1 && !Array.isArray(prev[objKey[0]])) {
        // 对象键值对中值不为数组但是prop形如school[0]时 直接return undefin
        return undefined
      } else {
        // prop为school时 即objKey.length=1时候
        return prev[objKey[0]]
      }
    } else {
      return undefined
    }
  }, obj)
  return res
}

/** 以下为测试代码 */
deepGet(
  {
    school: {
      student: { name: "Tomy" },
    },
  },
  "school.student.name"
) // => 'Tomy'

deepGet(
  {
    school: {
      students: [{ name: "Tomy" }, { name: "Lucy" }],
    },
  },
  "school.students[1].name"
) // => 'Lucy'

// 对于不存在的属性,返回 undefined
deepGet({ user: { name: "Tomy" } }, "user.age") // => undefined
deepGet({ user: { name: "Tomy" } }, "school.user.age") // => undefined