【问题标题】:Targeting (un)known locations in an object with Javascript使用 Javascript 定位对象中的(未知)位置
【发布时间】:2010-08-15 05:36:01
【问题描述】:

我很难让人们在这里对我需要什么做出结论,所以请在回答之前阅读并考虑一下。

情况如下:

你有一个传入的对象。你不知道这个对象的结构。但是,您确实对对象中的某些内容有“目标”。所以让我们假设存在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;
}

..等

这显然是非常混乱的,并不是最优解。

这是否正确解释了我的问题?是否有更清洁的方式来完成此操作?

提前感谢您提供的任何建议。

【问题讨论】:

    标签: javascript object


    【解决方案1】:

    我的一次尝试:

    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...
    }
    

    【讨论】:

    • 谢谢!附带问题:你猜这有多慢?
    • 如果您提前知道路径,我认为这不会明显慢。 obj.leve1.level2.target 之类的每个 . 都需要运行时查找,因此您不会通过预知获得任何东西。尽管对于遍历的每个深度,您都需要额外的访问权限才能使用此方法(targets[i] 部分)获取目标的名称。我不会担心此代码的速度,除非targets.length 变大。
    【解决方案2】:

    如果您可以使用(或在 IE 中包含)reduce Array 方法,则另一种方法:

    function getTarget(obj, target) {
      return target.reduce(function(a, b) { return a && a[b]; }, obj);
    }
    
    // usage (assuming that `myObject` is your sample object):
    var target = ['firstLevel', 'secondLevel' ,'targetProperty'];
    getTarget(myObject, target); // "The goods!"
    

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 1970-01-01
      • 2011-11-12
      • 2012-03-06
      • 2023-03-04
      • 1970-01-01
      • 2018-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多