Ориентация (не) известных местоположений в объекте с помощью Javascript - PullRequest
0 голосов
/ 15 августа 2010

У меня были проблемы с людьми, которые спешат с выводами о том, что мне нужно здесь, поэтому, пожалуйста, прочитайте это и подумайте, прежде чем ответить.

Вот случай:

У вас естьвходящий объект.Вы не знаете структуру этого объекта.Однако у вас есть «цель» для чего-то в объекте.Итак, давайте представим, что есть 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;
}

.. и т. Д.

Это, очевидно, очень грязное и не оптимальное решение.

Правильно ли это объясняет мою проблему?Есть ли более чистые способы для достижения этой цели?

Заранее благодарим вас за любые советы, которые вы можете дать.

Ответы [ 2 ]

1 голос
/ 15 августа 2010

Другой подход, если вы можете использовать (или включить для 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!"
1 голос
/ 15 августа 2010

покушение на макушку:

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...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...