不知道属性名,如何一行代码动态取最里面的值?

117 阅读1分钟

背景

const test = {
  [xxxxx]: {
    [yyyyy]: [1111]
  }
}

给定一个对象,但并多层对象的key是动态的,如何一行代码取最里面的值拿到 [1111] ? 工作中遇到一个字段是动态变化的,无法确定字段的值,所以有了这篇文章。

尝试

const obj = {a:{b:[1111]}}
const [first] = Object.keys(obj)
const aa = obj[first]
const [second] = Object.keys(aa)
const bb = aa[second]
console.log(bb)
// [1111]
const obj = {
  a: {
    b: [1111]
  }
}
const {[Object.keys(obj)]: { [Object.keys(obj[Object.keys(obj)])]: val }} = obj
console.log(val)
// [1111]

但是key有可能是不可枚举的,

我们都知道,Object.keys()返回属性key,但不包括不可枚举的属性,

Reflect.ownKeys()返回所有属性key,

所以

方案

const obj = {
  a: {
    b: [1111]
  }
}
const { [Reflect.ownKeys(key)]: bb } = ({ [Reflect.ownKeys(obj)]: key } = obj, key)
console.log(bb)
// [1111]

简化后其实就是

const obj = {
  a: {
    b: [1111]
  }
}
const { [Reflect.ownKeys(obj)]: key } = obj
const { [Reflect.ownKeys(key)]: bb } = key
console.log(bb)
// [1111]

参考文档

Reflect.ownKeys 与 Object.keys 的区别