首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在不知道属性在嵌套js对象中的路径的情况下访问属性的方法。

在不知道属性在嵌套js对象中的路径的情况下访问属性的方法。
EN

Stack Overflow用户
提问于 2018-06-07 06:50:21
回答 2查看 69关注 0票数 0

有没有一种方法可以在不知道对象路径的情况下访问对象中的嵌套属性?例如,我可以有这样的东西

代码语言:javascript
复制
let test1 = {
  location: {
    state: {
     className: 'myCalss'
    }
 }
};

let test2 = {
  params: {
    className: 'myCalss'
  }
};

有没有很好的方法来“提取”className属性?我有一个解决方案,但它相当难看,而且它只解决了这两个案例,我想知道是否有更灵活的方法可以做

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-07 07:11:23

下面是创建嵌套属性getter的一种比较优雅的方法:

代码语言:javascript
复制
const getProperty = property => {
  const getter = o => {
    if (o && typeof o === 'object') {
      return Object.entries(o)
        .map(([key, value]) => key === property ? value : getter(value))
        .filter(Boolean)
        .shift()
    }
  }

  return getter
}

const test1 = {
  location: {
    state: {
      className: 'test1'
    }
  }
}

const test2 = {
  params: {
    className: 'test2'
  }
}

const test3 = {}

const getClassName = getProperty('className')

console.log(getClassName(test1))
console.log(getClassName(test2))
console.log(getClassName(test3))

如果您想防止循环对象导致堆栈溢出,我建议使用WeakSet来跟踪迭代的对象引用:

代码语言:javascript
复制
const getProperty = property => {
  const getter = (o, ws = new WeakSet()) => {
    if (o && typeof o === 'object' && !ws.has(o)) {
      ws.add(o)
      return Object.entries(o)
        .map(([key, value]) => key === property ? value : getter(value, ws))
        .filter(Boolean)
        .shift()
    }
  }

  return getter
}

const test1 = {
  location: {
    state: {
      className: 'test1'
    }
  }
}

const test2 = {
  params: {
    className: 'test2'
  }
}

const test3 = {}
const test4 = {
  a: {
    b: {}
  }
}

test4.a.self = test4
test4.a.b.self = test4
test4.a.b.className = 'test4'

const getClassName = getProperty('className')

console.log(getClassName(test1))
console.log(getClassName(test2))
console.log(getClassName(test3))
console.log(getClassName(test4))

票数 3
EN

Stack Overflow用户

发布于 2018-06-07 06:59:59

好的。试一试。它递归地迭代对象并返回第一个匹配项。您可以根据需要将for循环配置为全部匹配或最后匹配

代码语言:javascript
复制
let test1 = {
  location: {
    state: {
     className: 'myCalss'
    }
 }
};

let test2 = {
  params: {
    className: 'myCalss'
  }
};

function getClassName(obj) {
  if(typeof obj === "object" && 'className' in obj) {
    return obj.className
  }
  const keys = Object.keys(obj)
  for(let i = 0; i < keys.length; i++) {
    let key = keys[i]
    let res = getClassName(obj[key])
    if(res) return res
  }
  return null
}

console.log(getClassName(test1), getClassName(test2))

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50730685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档