我该如何使用括号中的单个变量来访问深层值呢

how would I go about accessing a deep value using a single variable in bracket notation?

本文关键字:访问 变量 单个 何使用      更新时间:2023-09-26

我想知道如何执行以下操作-我有以下数据:

dta = {
       "fielddata": {
           "text1": "4B030C2E-3D53-4DF8-A3535EF377B45DE5",
           "text2": "Unlabeled"
       }
}

我可以使用括号符号访问,比如

var result = dta["fielddata"]["text1"];

没问题,我可以使用这样的变量

var val1 = "fielddata",
    val2 = "text1",
    acc = dta[val1][val2];
log(acc);

再说一遍,太棒了——但当我只有一个变量包含点符号时呢?

比如,如果我只有怎么办

var val = "fielddata.text1",
    acc = dta[val];
log(acc);

这将产生一个未定义的。有什么想法吗?

非常感谢!Marco

var val = "fielddata.text1",
    acc = dta,               // reference the base object
    parts = val.split('.'),  // split the val into an Array of individual parts
    i;
  // Iterate the parts, updating acc each time
for( i = 0; i < parts.length; i++ )
    acc = acc[parts[i]];

另一个选项是JSONPath。对于相对简单的用例,手动执行可能是更好的解决方案,但如果更复杂,我可能会使用更正式的方法。

虽然我不想建议这样做,但总有eval('dta.fielddata.text1')

getter

exports.getDeep = function(field, object){
  var parts = field.split('.');
  var value = object;
  // Iterate the parts, updating value each time
  for( var i = 0; i < parts.length; i++ ){
      value = value[parts[i]];
      if(i==parts.length-1){
        return JSON.parse(JSON.stringify(value))
      }
  }
}

设置

exports.setDeep = function(field, object, newvalue){
  var parts = field.split('.');
  for( var i = 0; i < parts.length; i++ ){
      if(i==parts.length-1){
        object[parts[i]] = newvalue
        return object
      }
  }
}