JavaScript:转换字符串并连接它以动态创建对象属性引用

JavaScript:转换字符串并连接它以动态创建对象属性引用,javascript,json,object,ecmascript-6,eval,Javascript,Json,Object,Ecmascript 6,Eval,我正在创建一个API,其中服务器通过数据属性传递值,因此JS可以用来检索信息。。。我的JS发出一个AJAX调用,并返回一个JSON对象 { "data": { "results": { "type": [ { "cars" : { "brands": { "ford" : {

我正在创建一个API,其中服务器通过数据属性传递值,因此JS可以用来检索信息。。。我的JS发出一个AJAX调用,并返回一个JSON对象

{
    "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-indightmeth
Jonasw
接受的答案效果很好……如果
数据,就会出现这种情况。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];
}