在Javascript中动态调用几个级别的对象?

时间:2013-12-31 04:25:33

标签: javascript object dynamic return

var myObj = {
    bar_foo : "test",
    bar : {
       foo : "hi there";
         },
    foo : {
          bar : {
                 foo: "and here we go!"
                 }
           }
     }

如何获得:

var arr = [["bar", "foo"], ["foo", "bar", "foo"]];

返回:

myObj["bar"]["foo"];
myObj["foo"]["bar"]["foo"];

arr可以是任意长度,以便它遍历对象。

所以我们知道我们可以像这样动态调用对象的值:

var normal = myObj [“bar_foo”];

normally等于"test"

但是这种技术假设我们知道遍历的深度。

我要做的是通过提供数组来检索对象值

["bar", "foo"]

与...基本相同:

myObj["bar"]["foo"];

我这样做的原因是因为我正在根据我想要的值创建一个新对象。

所以最终的结果是:

arr_new = myObj.someMethod(arr);

其中arr_new是:

arr_new : ["hi there", "and here we go!"];

我希望澄清它。

4 个答案:

答案 0 :(得分:3)

如果你正在使用下划线(或者可以使用原生JS mapreduce),请试试这个:

var myObj = {
  bar: {
    foo: "hi there"
  },
  foo: {
    bar: {
      foo: "and here we go!"
    }
  }
};

var arr = [
  ["bar", "foo"],
  ["foo", "bar", "foo"]
];

function deepProp(arr, obj) {
  return _.reduce(arr, function(memo, val) {
    return memo[val];
  }, obj);
}

var deepProps = _.map(arr, function(deepArray) {
  return deepProp(deepArray, myObj);
});

console.log(deepProps); // => ["hi there", "and here we go!"]

可能有更优雅的解决方案;这是一个快速的黑客。似乎做了你想要的几乎! :P

答案 1 :(得分:2)

Object.prototype.someMethod = function (arr) {

  function a (obj, array){
    var res = obj[array.splice(0, 1)[0]];
    if (typeof res === 'object' && array.length) {
      return a(res, array);
    }else{
      return res;
    }
  }
  var result = [];
  for (var i = 0; i < arr.length; i++) {
    result.push(a(this, arr[i]));
  }
  return result;
};

JSBin&gt;&gt; Demo

答案 2 :(得分:1)

也许这就是你要找的东西?

function getObjValue( arr, obj){
    var tmp=obj;
    for(i=0;i<arr.length;i++){
        tmp=tmp[arr[i]];
    }
    return tmp
}

alert( getObjValue( arr[1],myObj)); // "and here we go!"

创建值数组:

var result=arr.map(function(subArr){
   return  getObjValue(subArr,myObj);
})

DEMO

答案 3 :(得分:1)

我做了一个小提示,显示了一个可能的答案,没有使用库:

http://jsfiddle.net/EfrainReyes/6s9HY/2/

var traverseObject = function(obj, arr) {
    var results = [];

    for (var i = 0; i < arr.length; i++) {
        var tempObj = obj;

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

        results.push(tempObj);
    }
    return results;
};

当然,这假设参数始终有效,但可以添加验证检查。