我遇到了麻烦,无法就我在这里的需求做出结论,因此请在阅读前仔细阅读并仔细考虑。
就是这种情况:
您有一个传入的对象。您不知道该对象的结构。但是,您确实对对象中的某物具有“目标”。因此,我们假设存在myObject
,并且您已定义了某种目标,如关联级别数组:
var objectTarget = [ 'firstLevel', 'secondLevel' ,'targetProperty' ];
现在,传入的
myObject
如下所示:{
firstLevel: {
secondLevel: {
targetProperty: "The goods!"
}
}
}
但是如前所述,您不知道其结构。您只知道
objectTarget
数组中的内容。我的问题是能够仅基于目标来寻址对象内的任意位置。如果我知道目标永远是三个层次,那么我可以像这样简单地引用它:
myObject[objectTarget[1]][objectTarget[2]][objectTarget[3]];
但是,由于我不确定水平深度的数量,因此这还不够。我能够完成此任务的唯一方法是选择最大数量的合理级别,然后将其打开。像这样:
switch ( objectTarget.length) {
case 1:
var result = myObject[objectTarget[1]];
break;
case 2:
var result = myObject[objectTarget[1]][objectTarget[2]];
break;
case 3:
var result = myObject[objectTarget[1]][objectTarget[2]][objectTarget[3]];
break;
case 4:
var result = myObject[objectTarget[1]][objectTarget[2]][objectTarget[3]][objectTarget[1]];
break;
}
..等等
这显然是非常混乱的,不是最佳解决方案。
这是否可以正确解释我的问题?有没有更清洁的方式来实现这一目标?
预先感谢您提供的任何建议。
最佳答案
试图摆脱我的头顶:
function findTarget(obj, targets) {
for(var i = 0; i < targets.length; i++) {
var prop = targets[i];
if(obj[prop] != undefined) {
obj = obj[prop];
} else {
return undefined; // Whatever you want when the target does not exist
// or, if it's useful to you
return obj; // Maximum reachable target
}
}
return obj;
}
var target = findTarget(incoming, ['level1', 'level2', ...]);
if(target == undefined) {
// couldn't traverse the entire target list...
}