我遇到了麻烦,无法就我在这里的需求做出结论,因此请在阅读前仔细阅读并仔细考虑。

就是这种情况:

您有一个传入的对象。您不知道该对象的结构。但是,您确实对对象中的某物具有“目标”。因此,我们假设存在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...
}

10-05 20:16
查看更多