Javascript 获取嵌套的obj值

Javascript 获取嵌套的obj值,javascript,eval,Javascript,Eval,鉴于以下目标: var inputMapping = { nonNestedItem: "someItem here", sections: { general: "Some general section information" } }; 我正在编写一个函数,通过传入字符串“nonNestedItem”或嵌套的case“sections.general”来获取该数据。我不得不使用eval,我想知道是否有更好的方法 这是我到目前为止所做的,它工作正常。但是要改进 functio

鉴于以下目标:

var inputMapping = {
 nonNestedItem: "someItem here",
 sections: {
   general: "Some general section information" 
 }
};
我正在编写一个函数,通过传入字符串
“nonNestedItem”
或嵌套的case
“sections.general”
来获取该数据。我不得不使用
eval
我想知道是否有更好的方法

这是我到目前为止所做的,它工作正常。但是要改进

function getNode(name) {
  var n = name.split(".");

  if (n.length === 1) { 
   n = name[0];
  } else { 
    var isValid = true,
        evalStr = 'inputMapping';

    for (var i=0;i<n.length;i++) { 
      evalStr += '["'+ n[i] +'"]';

      if (eval(evalStr) === undefined) {
        isValid = false;
        break;
      }
    }

    if (isValid) { 
      // Do something like return the value 
    }
  }
}
函数getNode(名称){ var n=名称。拆分(“.”); 如果(n.length==1){ n=名称[0]; }否则{ var isValid=true, evalStr='inputMapping'; 对于(var i=0;i您可以使用如下函数

var accessString = "sections.general";

console.log(accessString.split(".").reduce(function(previous, current) {
    return previous[current];
}, inputMapping));
输出

Some general section information
如果您的环境不支持
reduce
,则可以使用此递归版本

function getNestedItem(currentObject, listOfKeys) {
    if (listOfKeys.length === 0 || !currentObject) {
        return currentObject;
    }
    return getNestedItem(currentObject[listOfKeys[0]], listOfKeys.slice(1));
}
console.log(getNestedItem(inputMapping, "sections.general".split(".")));

您不需要在此处使用
eval()
。您可以使用
[]
从对象获取值。使用临时对象保存当前值,然后在每次需要下一个键时更新它

function getNode(mapping, name) {
    var n = name.split(".");

    if (n.length === 1) {
        return mapping[name];
    } else {
        var tmp = mapping;
        for (var i = 0; i < n.length; i++) {
            tmp = tmp[n[i]];
        }
        return tmp;
    }
}
函数getNode(映射,名称){
var n=名称。拆分(“.”);
如果(n.length==1){
返回映射[名称];
}否则{
var tmp=映射;
对于(变量i=0;i
Woah!巧妙地使用了
.reduce()
!您也可以只填充
.reduce())
如果它不存在:这里没有JSON。不要将JavaScript对象与JSON混淆。冷静可能重复。好吧,这是一个js对象,我将删除对
JSON
的所有引用。不过有点挑剔。我不认为这是一个重复的问题。