获取嵌套的 obj 值



给定以下对象:

var inputMapping = {
 nonNestedItem: "someItem here",
 sections: {
   general: "Some general section information" 
 }
};

我正在编写一个函数来get该数据,方法是传入字符串"nonNestedItem"或嵌套大小写"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 
    }
  }
}

林基到杰斯宾

你可以

像这样使用Array.prototype.reduce函数

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()。 您可以使用[]从对象中获取值。 使用 temp 对象保存当前值,然后在每次需要下一个键时更新它。

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;
    }
}

最新更新