拆分'{a} {b} {c}'?

时间:2011-03-09 02:55:06

标签: javascript arrays string split

我有一个看起来像

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

我有一个函数可以获得一个看起来像{b}{a}{a}的掩码我想要做的是获取obj.b.a.a的值我该怎么做?

5 个答案:

答案 0 :(得分:4)

切掉第一个和最后一个字符,按}{分割,然后依次递归访问每个元素的对象(因为foo.barfoo['bar']是等效的。)

答案 1 :(得分:2)

如果你的面具总是有三个属性,这将有效。如果没有,你可以写一个类似的函数:

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

obj[props[0]][props[1]][props[2]];

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您可以使用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('}{'));
}

答案 4 :(得分:0)

这是我的代码,不使用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(''));
}