0
var a = {
    one: 1,
    two: 2,
    three: {
        four: 4,
        five: 5,
    },
};
var c = ['three', 'four']; 

c可以有n值。 a是一个包含大量数据的对象。

我已经c配置了我需要从中获取的特定条目a

我需要得到价值a['three']['four']

我可以做到if (c.length == 1 or 2 or 3)并且它有效,但我认为这不是最好的方法。我也试过a[c],但它返回undefined

我整天都在寻找替代解决方案,但我似乎找不到任何东西。我想这不是很常见的问题。

4

1 回答 1

3

我假设c数组中保存的键数是未知的。

我喜欢.reduce()评论中给出的解决方案,但这里有一个详细的演练需要发生的事情,以便您理解。

// Your initial data
var a = {one: 1, two: 2, three: {four: 4, five: 5}};
var c = ['three', 'four'];

// New variable to store the result. We start it off with the `a` object
var result = a;

// Loop the property names
for (var i = 0; i < c.length; i++) {
    // Grab the property at the current array index
    var key = c[i];

    // Get the value using the key and the current `result` object
    var new_obj = result[key];

    // Overwrite the current `result` object with the new value we got from the key
    result = new_obj;

    // Break the loop if we ran out of data
    if (result == null)
        break;
}

所以基本上我们只是循环键,在每次迭代中从当前对象中获取一个值,并用新值覆盖当前对象。

当循环完成时,希望我们已经遍历到我们想要的点。


一个不太冗长的版本可能如下所示:

var result = a;

for (var i = 0; i < c.length; i++) {
    result = result[c[i]];

    if (result == null)
        break;
}
于 2013-05-22T11:52:06.137 回答