如何根据数组访问对象中的属性

时间:2016-10-17 03:55:33

标签: javascript

所以我有一个这样的数组:

var arr=[one, lol];

和像这样的对象

var obj={
    one:{
        lol:11234
    }
}

如果我做obj [lol]我怎么做到那么它会打印出11234?请记住,我不知道数组有多长,而像console.log(obj [one] [lol])这样的答案是行不通的。提前谢谢。

4 个答案:

答案 0 :(得分:1)

您可以存储以前属性的值(最初为obj)并继续循环直到数组结束,如下所示:



var arr = ['one', 'two', 'three'];

var obj = {
  one: {
    two: {
      three: 11234
    }
  }
}

var currentProp = obj;

for(var i = 0; i < arr.length; i++) {
  currentProp = currentProp[arr[i]];
}

console.log(currentProp);
&#13;
&#13;
&#13;

上面的代码将从对象obj开始,然后循环直到数组的长度,然后将currentProp重新分配给数组中的下一个属性。在这种情况下,这就是它的作用:

  • 首次迭代,访问obj[arr[0]] one,并将其分配给currentProp
  • 第二次迭代,访问obj[arr[0]][arr[1]]one[arr[1]],即two,并将其分配给currentProp
  • 第三次迭代,访问obj[arr[0]][arr[1]][arr[2]]two[arr[2]]three,并将其分配给currentProp。然后循环终止,因为它已到达列表的末尾。

最后,最后一个属性的值将在currentProp,并将正确输出11234。

答案 1 :(得分:0)

您需要尝试这样:

obj["one"]["lol"]

JsFiddle:https://jsfiddle.net/3we2ohy6/1/

答案 2 :(得分:0)

由于您只是查找属性值,因此更容易:

console.log(obj.one.lol);

使用方括号按照你的方式来做它JS认为一个和LOL都是变量。除非你用引号括起来。

console.log(obj['one']['lol');

除非您创建一个重构obj对象的函数或者将obj.one作为属性提供给它的函数,否则您将无法获得正在查找的值。

答案 3 :(得分:0)

您可以使用Array#reduce,因为这会返回您需要的对象,而不会在外面保留引用。

function set(object, path, value) {
    var last = path.pop();

    path.reduce(function (o, k) {
        return o[k] = o[k] || {};
    }, object)[last] = value;
}

var obj = {};

set(obj, ['one', 'lol'], '11234'); 
   
console.log(obj);