Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 拆分';{a} {b}{c}';?_Javascript_Arrays_String_Split - Fatal编程技术网

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(''));
}