【问题标题】:Iteratively accessing object keys [duplicate]迭代访问对象键[重复]
【发布时间】:2014-02-15 09:39:16
【问题描述】:

我有一个类似于以下的对象,尽管嵌套了几个字母:

var foo = {
    a:{
        a:{},
        b:{}
    },
    b:{
        a:{},
        b:{}
    }
}

给定一个包含“a”和“b”的任意长度数组,例如['b','a'],我想修改由数组字母映射的对象键。所以用我刚才给出的数组,我想修改 foo['b']['a'],或者 foo.b.a.

我可以想到一个简单的方法来获取目标值,使用类似以下的方法:

var context = foo
for(letter in array){
 context = context[letter]
}
return context

这样做的问题是,如果我尝试修改上下文的最终值,它不会修改原始对象,这正是我想要的。理想情况下,如果我有一些创建指针的方法,这会很简单,但我认为 javascript 没有它们。

那么有什么方法可以有效地做到这一点吗?

【问题讨论】:

  • foo[letter] = 'modified value',然后。
  • Javascript 数组和对象总是作为引用传递,它们不会被复制。所以context的最终值应该是一个可以修改的对象。
  • 您能否展示一个对原始数据进行操作的示例以及结果应该是什么样的?不清楚。
  • @Barmar 我可以修改上下文,是的;但它不包含对 foo 中相同位置的引用,因此 foo 将保持不变。
  • 如果你做context.bar = 3,然后看foo,你应该在适当的地方看到a: { bar: 3 }

标签: javascript


【解决方案1】:

一个可重用的函数可以轻松解决任意深度:

function resolve(path, object) {
    var tob = object;
    path.map(function(a) {
        return (tob = tob[a]) || tob;
    });
    return tob;
}


var foo = {
    a:{
        a:{},
        b:{}
    },
    b:{
        a:{},
        b:{}
    }
};

var path= ['b','a'] ;


// resolve path and add a new property:
resolve(path, foo).c=123;
console.log(foo) /* shows:
{
    "a": {
        "a": {},
        "b": {}
    },
    "b": {
        "a": {
            "c": 123
        },
        "b": {}
    }
} */

因此我们可以看到现在有一​​个属性 foo.b.a.c 正如预期的那样。

【讨论】:

    猜你喜欢
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 2019-10-06
    • 1970-01-01
    相关资源
    最近更新 更多