分享

从字符串引用Javascript对象

 印度阿三17 2019-06-10

鉴于数据类似于:

var data = [{id: 12345, 
    name:'my products', 
    items:[{ 
               size: 'XXL', 
               sku: 'awe2345', 
               prices:[{type: 'rrp',prices: 10.99}, 
                        {type: 'sell_price', price: 9.99}, 
                         {type:'dealer', price:4.50} 
               ] 
               },{ 
               size: 'XL', 
               sku: 'awe2346', 
               prices:[{type: 'rep', prices: 10.99}, 
                          {type: 'sell_price', price: 9.99}, 
                          {type:'dealer', price:4.50} 
               ] 
               } 
       ] 
   }] 
}]

有没有办法评估数据对象中元素的字符串表示?例如:“data [0] .items [0] .prices [0] .rrp”…不使用eval()?

解决方法:

理想的解决方案是首先没有字符串表示.认真问自己,是否更改现有代码,以更理想的输出为您提供内容.

但是,如果你不能,这应该做你想要的:

var path = "data[0].items[0].prices[0].rrp".split(/[\[\]\.] /);
var next = window;

if (path[path.length - 1] == "") {
    path.pop();
};

while (path.length && (next = next[path.shift()]) && typeof next == "object" && next !== null);

next;

为此创建一个函数:

function get(path) {
    var next = window;

    path = path.split(/[\[\]\.] /);

    if (path[path.length - 1] == "") {
        path.pop();
    };

    while (path.length && (next = next[path.shift()]) && typeof next === "object" && next !== null);

    return path.length ? undefined : next;
}

缺点:

>变量数据必须在全局范围内才能工作(不能是局部变量).
>这很邋..使用它作为最后的手段.

编辑:要使用设置功能,您可以滥用JavaScript对象的pass-by-reference性质,如下所示:

function set(path, value) {
    var split = Math.max(path.lastIndexOf("["), path.lastIndexOf("."));

    get(path.slice(0, split))[path.slice(split   1).replace(/\]/, "")] = value;
}

提供一些解释如何工作:

getter首先将输入拆分为一个数组,因此每个元素都是我们需要遍历的成员[data,0,items,0,price,0,rrp].如果搜索字符串以“]”结尾,我们会在数组末尾获得一个额外的空元素,因此我们检查并删除它.

然后我们做了大循环;所以我们有遍历的元素(而path.length),将下一个变量设置为我们需要遍历的下一个对象成员= next [path.shift()].检查它是否为对象(否则它将没有任何成员遍历),并检查它是否为null(因为typeof null ==“object”).

一旦循环执行完毕,我们将拥有链中的最后一个元素;所以归还它.

setter在搜索字符串中搜索最后一个对象引用,并使用get()函数检索该对象引用.然后,它将返回的对象键设置为所需的值.如果我们没有这样做,我们一直在设置一个值而不是一个引用,所以“真正的”对象永远不会更新.

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多