我有一个看起来像
的对象var obj = {
a: {
a: {
a: 'value'
}
},
b: {
a: {
a: 'value2'
},
b: {
a: 'value3'
}
}
}
我有一个函数可以获得一个看起来像{b}{a}{a}
的掩码我想要做的是获取obj.b.a.a
的值我该怎么做?
答案 0 :(得分:4)
切掉第一个和最后一个字符,按}{
分割,然后依次递归访问每个元素的对象(因为foo.bar
和foo['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(''));
}