split '{a} {b} {c}'? - PullRequest
       9

split '{a} {b} {c}'?

2 голосов
/ 09 марта 2011

У меня есть объект, который выглядит как

var obj = {
   a: {
      a: {
         a: 'value'
      }
   },
   b: {
      a: {
         a: 'value2'
      },
      b: {
         a: 'value3'
      }
   }
}

У меня есть функция, которая получает маску, которая выглядит как {b}{a}{a}, что я хочу сделать, это получить значение в obj.b.a.a как я могу это сделать?

Ответы [ 5 ]

4 голосов
/ 09 марта 2011

Вырежьте первый и последний символ, разделите на }{, а затем рекурсивно получите доступ к объекту с каждым элементом по очереди (поскольку foo.bar и foo['bar'] эквивалентны).

2 голосов
/ 09 марта 2011

Это будет работать, если ваша маска всегда имеет три свойства.Если нет, вы можете написать функцию, которая делает нечто подобное:

var mask = "{a}{b}{c}";
var props = mask.replace(/{|}/g, "");

obj[props[0]][props[1]][props[2]];
0 голосов
/ 11 мая 2015

Вот мой код без использования eval.Его тоже легко понять.

function value(obj, props) {
  if (!props) return obj;
  var propsArr = props.split('.');
  var prop = propsArr.splice(0, 1);
  return value(obj[prop], propsArr.join('.'));
}

var obj = { a: { b: '1', c: '2', d:{a:{b:'blah'}}}};

console.log(value(obj, 'a.d.a.b')); //returns blah

Если вы все еще используете часть маски, вы можете немного изменить код.

function value(obj, props) {
    if (!props) return obj;
    var propsArr = props.match(/\{[a-zA-Z1-9]+\}/g);
    var prop = propsArr.splice(0, 1);
    return value(obj[prop[0].replace('{', '').replace('}', '')], propsArr.join(''));
}
0 голосов
/ 18 июня 2011

Вы можете использовать reduce вместо рекурсии.Вот одна строка:

function index(obj, indexList) {
    return indexList.reduce(function(obj,x){return obj[x]}, obj);
}

function indexWithMask(mask) {
    return index(obj, mask.slice(1,-1).split('}{'));
}
0 голосов
/ 09 марта 2011
obj.getMask = function(s) {
  var o=this, attrs=s.slice(1,s.length-1).split("\}\{");
  while (attrs.length > 0) {
    o = o[attrs.shift()];
    if (!o) return null;
  }
  return o;
};
obj.getMask("{a}{a}{a}"); // => "value"
obj.getMask("{b}{a}{a}"); // => "value1"
obj.getMask("{x}{y}{z}"); // => null

Конечно, вы можете изменить сигнатуру на "obj" вместо использования this, если вы не хотите портить сам объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...