从字符串引用Javascript对象
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了从字符串引用Javascript对象,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2089字,纯文字阅读大概需要3分钟。
内容图文
![从字符串引用Javascript对象](/upload/InfoBanner/zyjiaocheng/808/926bd5d1397943d7b2a81588fc6efa0a.jpg)
鉴于数据类似于:
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()函数检索该对象引用.然后,它将返回的对象键设置为所需的值.如果我们没有这样做,我们一直在设置一个值而不是一个引用,所以“真正的”对象永远不会更新.
内容总结
以上是互联网集市为您收集整理的从字符串引用Javascript对象全部内容,希望文章能够帮你解决从字符串引用Javascript对象所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。