Javascript 拆分';{a} {b}{c}';?
我有一个物体看起来像Javascript 拆分';{a} {b}{c}';?,javascript,arrays,string,split,Javascript,Arrays,String,Split,我有一个物体看起来像 var obj = { a: { a: { a: 'value' } }, b: { a: { a: 'value2' }, b: { a: 'value3' } } } 我有一个函数,它得到一个掩码,看起来像{b}{a}{a},我想做的是在obj.b.a.a处获取值,我该怎么做?切掉第一个和最后一个字符,按}{/code>
var obj = {
a: {
a: {
a: 'value'
}
},
b: {
a: {
a: 'value2'
},
b: {
a: 'value3'
}
}
}
我有一个函数,它得到一个掩码,看起来像
{b}{a}{a}
,我想做的是在obj.b.a.a
处获取值,我该怎么做?切掉第一个和最后一个字符,按}{/code>分割,然后依次递归地访问每个元素的对象(因为foo.bar
和foo['bar']
是等效的)。如果您的掩码始终有三个属性,则此功能将起作用。如果没有,则可以编写一个执行类似操作的函数:
var mask = "{a}{b}{c}";
var props = mask.replace(/{|}/g, "");
obj[props[0]][props[1]][props[2]];
当然,如果您不想弄脏对象本身,您可以将签名更改为传入“obj”,而不是使用this
。您可以使用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('}{'));
}
这是我的代码,没有使用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(''));
}
在obj.a.b.c
上没有值;-)你能澄清这个问题吗?obj.a.b将是未定义的,因为obj.a对象没有“b”属性:)使用mask=mask.substr(1).substr(0,mask.length-2).拆分('}{');
var arr=obj;for(mask中的var i)arr=arr[mask[i]`
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(''));
}