JavaScript:转换字符串并连接它以动态创建对象属性引用
我正在创建一个API,其中服务器通过数据属性传递值,因此JS可以用来检索信息。。。我的JS发出一个AJAX调用,并返回一个JSON对象JavaScript:转换字符串并连接它以动态创建对象属性引用,javascript,json,object,ecmascript-6,eval,Javascript,Json,Object,Ecmascript 6,Eval,我正在创建一个API,其中服务器通过数据属性传递值,因此JS可以用来检索信息。。。我的JS发出一个AJAX调用,并返回一个JSON对象 { "data": { "results": { "type": [ { "cars" : { "brands": { "ford" : {
{
"data": {
"results": {
"type": [
{
"cars" : {
"brands": {
"ford" : {},
"honda" : {}
}
}
}
]
}
}
}
为了得到品牌,我只是打字
let brand = data.result.type[0].cars.brands.ford
这样我可以得到我需要的结果,但是我需要动态地构建这个路径,通过连接路径的两个部分。正如我在问题的开头所说,一些信息是通过数据属性传递的,信息是类型[0]。cars.brands.ford
。。。我需要将此连接到我的代码中的数据。结果。我目前可以通过使用eval()
获得所需的结果,如下所示
entry.querySelectorAll('[data-brand]').forEach((e) =>
let brand = eval('data.result.' + e.dataset.brand);
)
我知道你们中的许多人会说使用eval()
是不好的,我很清楚这一点,但我就是找不到更好的方法来实现这一点,还有另一个问题,当品牌,比如说,nissan
不在JSON上时,我得到一个错误TypeError:无法读取未定义的属性“nissan”
。。。在继续编写代码之前,可以通过检查属性是否存在来避免这种情况,但是当涉及eval()
时,我不知道如何进行这种测试
所以。。。基本上,我需要的是一种更好的动态构建属性路径的方法,可以测试该属性是否存在
提前感谢…您可以检查允许您使用路径访问对象值的方法
如果lodash对您来说太大,只需检查它们的实现
const brand = e.dataset.brand.split(".").reduce((obj,id) => obj[id] || {}, data.results);
这不支持支架,所以:
type.0.whatever.keys
要返回不存在的键(而不是空对象)的未定义项,请执行以下操作:
您可以先检查data.result是否具有该属性,然后再创建变量品牌:
if(data.result.hasOwnProperty(e.dataset.brand)){
let brand = data.result[e.dataset.brand];
}
您可以找到所有键,然后使用迭代键,并从对象中获取键值:
const obj={“data”:{“results”:{“type”:[{“cars”:{“brands”:{“ford”:{“name”:“ford”},“honda”:{“name”:“honda”}}}}}}};
const brand='data.results.type[0].cars.brands.ford';
常量getPathValue=(src,path)=>path.match(/[^.\[\]]+/g)
.reduce((p,k)=>typeof p=='object'?p[k]:p,src);
const brandOBj=getPathValue(obj,品牌);
控制台日志(brandOBj)
你可以使用数据。result['property\u name']谢谢你的回答,但我已经尝试过了,但没有效果……到底什么不起作用?@Jonasw-indightmethJonasw
接受的答案效果很好……如果数据,就会出现这种情况。result
没有你正在循环的品牌。非常感谢。。。我不知道reduce()
。。。我会研究更多关于它的。。。它工作得很好。。我只需要调整数据属性,将类型[0].cars.brands.ford
转换为类型.0.cars.brands.ford
只需一个问题。。。我仍然收到TypeError:无法读取未定义的属性“sentra”
,因为没有设置品牌nissan
。。。所以,基本上这不存在type.0.cars.brands.nissan.sentra
。。。当父属性不存在时,如何停止reduce()
迭代?你知道吗?只有当nissan
是最后一款时,这才有效。。。当物品在中间时,它实际上不起作用。在我的示例中,品牌nissan
位于sentra
之前,因此,如果reduce为false,它不会退出,而是继续搜索结果。。。那就是错误发生的时候。。。
if(data.result.hasOwnProperty(e.dataset.brand)){
let brand = data.result[e.dataset.brand];
}