Javascript 通过点语法字符串路径访问对象
如何通过字符串Javascript 通过点语法字符串路径访问对象,javascript,Javascript,如何通过字符串path.to.obj访问myobject[path][to][obj]?我想调用一个函数Settings.write('path.to.setting','settingValue'),它将'settingValue'写入settingObj[path][to][setting]。如果没有eval(),我怎么做 我终于在下面的一个用户回答的时候找到了答案。如果有人感兴趣的话,我会在这里发布我的,并附上关于它如何工作的文档 (function(){ var o = {},
path.to.obj
访问myobject[path][to][obj]
?我想调用一个函数Settings.write('path.to.setting','settingValue')
,它将'settingValue'
写入settingObj[path][to][setting]
。如果没有eval()
,我怎么做
我终于在下面的一个用户回答的时候找到了答案。如果有人感兴趣的话,我会在这里发布我的,并附上关于它如何工作的文档
(function(){
var o = {}, c = window.Configure = {};
c.write = function(p, d)
{
// Split the path to an array and assaign the object
// to a local variable
var ps = p.split('.'), co = o;
// Iterate over the paths, skipping the last one
for(var i = 0; i < ps.length - 1; i++)
{
// Grab the next path's value, creating an empty
// object if it does not exist
co = (co[ps[i]])? co[ps[i]] : co[ps[i]] = {};
}
// Assign the value to the object's last path
co[ps[ps.length - 1]] = d;
}
c.read = function(p)
{
var ps = p.split('.'), co = o;
for(var i = 0; i < ps.length; i++)
{
co = (co[ps[i]])? co[ps[i]] : co[ps[i]] = {};
}
return co;
}
})();
(函数(){
var o={},c=window.Configure={};
c、 写入=函数(p,d)
{
//将路径拆分为数组并重新指定对象
//到局部变量
var ps=p.split(‘.),co=o;
//在路径上迭代,跳过最后一个路径
对于(变量i=0;i
我遇到问题的原因是你必须跳过最后一条路。如果包含最后一个路径,则只需指定任意对象。您可以使用
str.split()
实现此目的:
path = pathString.split('.');
settingObj[path[0]][path[1]][path[2]] = settingValue;
str.split()
当然,这只是操作的根源,并假定输入正确
编辑:由于路径的长度需要可变,下面是根据上面显示的语法编辑的更新版本:
(function(){
var o = {}, c = window.Configure = {};
c.write = function(p, d)
{
var ps = p.split('.'), co = o;
for(var i = 0; i < ps.length - 1; i++)
{
co = (co[ps[i]])? co[ps[i]] : co[ps[i]] = {};
}
co[ps[ps.length-1]] = d;
}
c.read = function(p)
{
var ps = p.split('.'), co = o;
for(var i = 0; i < ps.length; i++)
{
co = (co[ps[i]])? co[ps[i]] : co[ps[i]] = {};
}
return co;
}
c.write('path.to.property', 'setting');
alert(c.read('path.to.property'));
})();
(函数(){
var o={},c=window.Configure={};
c、 写入=函数(p,d)
{
var ps=p.split(‘.),co=o;
对于(变量i=0;i
您的变量co
包含对属性的引用,但是当您使用co=p
更新co
的值时,您只是覆盖了co
的值,而不是属性的值。您需要保留对最后一个键的引用,并使用该键设置值:
(我知道我的答案有点晚了,但我想在用拇指打字的过程中付出了所有的努力之后,我还是把它包括进去吧)
我怀疑您遇到了分组错误。尝试将三元表达式中的结束参数移动到行尾:
co = (co[ps[i]] ? co[ps[i]] : co[ps[i]] = {});
我自己也会测试一下,但我是在手机上回答的,如果只用拇指打字,JSFIDLE会很乏味。但是你永远不知道路径到底有多少部分。可能是2,可能是6。我的错,我认为这是某种预先存在的设置或什么。我把代码放在这里:,这是我在看到你的编辑之前开始的,所以我会在一分钟内更新我的答案。哈哈,是的,我刚刚找到答案。我需要跳过最后一条路径,因为我只是指定了一个任意值。一旦您编辑您的答案,我将接受它。警告,您上面的代码将覆盖任何对象,即使您试图附加到它。第9行和第10行应改为co=(co[ps[i]])?co[ps[i]]:co[ps[i]={}代码>好的观点。我没有想到预先存在的设置路径。已编辑,应立即编辑。感谢您将其标记为答案。:)
co = co[key] && /object|function/.test(typeof co[key]) ? co[key] : co[key] = {};
co = (co[ps[i]] ? co[ps[i]] : co[ps[i]] = {});