Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过点语法字符串路径访问对象_Javascript - Fatal编程技术网

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]] = {});