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!"];
我希望澄清它。
答案 0 :(得分:3)
如果你正在使用下划线(或者可以使用原生JS map
和reduce
),请试试这个:
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;
};
当然,这假设参数始终有效,但可以添加验证检查。