javascript - 通过对象和两条路径的组合访问对象
问题描述
我想组合一个对象、一个变量中的路径和一个路径,就像在https://stackoverflow.com/a/43849204/14480225中解释的那样,但有3 个“部分”。
这是最小的可重现示例:我希望combine()
函数打印selector[0].children[foo].textContent
或selector[0].children[foo].children[0].textContent
取决于bar
值。
const selector = document.getElementsByClassName('main')
const foo = 0
let bar = ''
const toggle = () => {
if (bar === '') bar = '.children[0]'
else bar = ''
}
const test = () => {
console.log(combine('selector[0].children[foo]', bar, '.textContent'))
//I want a function like combine() that will print 'selector[0].children[foo].textContent' or 'selector[0].children[foo].children[0].textContent' depending on bar value.
}
<div class='main'>
<h1>Hello<span>world</span></h1>
<button onclick='toggle()'>toggle</button>
<button onclick='test()'>test</button>
</div>
我有一个返回多个相似属性的类 (10)。我的构造函数输入了一个值,该值可用于确定bar
最小示例中的内容。每个属性只需更改bar
最小示例中的内容即可获得预期的输出。我希望这样的东西能够在不同的情况之间进行切换,而不必为每种bar
情况编写大量的开关,因此会产生大量的代码重复。
解决方案
像这样的东西?但是在使用它之前请阅读eval()
这里:
call javascript object method with a variable
const selector = document.getElementsByClassName('main')
const foo = 0
let bar = ''
const toggle = () => {
if (bar === '') bar = '.children[0]'
else bar = ''
}
function combine(){
let result = "selector[0].children[foo]"+bar+".textContent"
return result
}
const test = () => {
console.log(eval(combine()))
//I want a function like combine() that will print 'selector[0].children[foo].textContent' or 'selector[0].children[foo].children[0].textContent' depending on bar value.
}
<div class='main'>
<h1>Hello<span>world</span></h1>
<button onclick='toggle()'>toggle</button>
<button onclick='test()'>test</button>
</div>
这是一种安全的使用方法:
const selector = document.getElementsByClassName('main')
const foo = 0
let bar = ''
const toggle = () => {
if (bar === '') bar = '.children[0]'
else bar = ''
}
function combine(){
return Function('"use strict";return (selector[0].children[foo]'+bar+'.textContent)')()
}
const test = () => {
console.log(combine())
}
<div class='main'>
<h1>Hello<span>world</span></h1>
<button onclick='toggle()'>toggle</button>
<button onclick='test()'>test</button>
</div>
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval#never_use_eval
推荐阅读
- android - 如何使用移动应用程序进入whatsapp分享链接工作?
- html - 如何在 xslt 中将数以千万计的金额转换为十进制值
- java - 弹性搜索 - Java BoolQuery API 应该过滤所有不匹配的
- google-cloud-platform - Google Cloud Builder - 构建触发器失败并显示“未找到请求的资源”
- vim - Vundle 安装不起作用
- selenium - 流利的等待不做任何轮询
- android - Android Arcgis 100.3:如何获取 MapView 的中心点
- php - 如何将此存储功能转换为 json
- css - Difference between web animation api and css3 keyframe?
- python - dcast and aggregate to length in pandas