使用变量访问嵌套的JavaScript对象

时间:2014-10-28 12:41:56

标签: javascript

我想访问(获取/设置)带有变量的嵌套JSS对象。

例如,静态看起来像这样:

$obj.children.12.children.32.Name; // Returns "Foo"

现在我有一个“路由”数组(或任何容易处理的数组):

["children",12,"children",32,"Name"]

想要获得对象的价值。

就像我在Stackover上阅读here一样,有一种非常简单的方法(解决方案2)。

但是,现在我想更改传递的键/路由的值。有没有办法做到这一点?

非常感谢!

修改 我可以使用jQuery / Angluar-Features,如果它对我有帮助的话。

1 个答案:

答案 0 :(得分:1)

借用accepted answer on the post you've linked to中的代码,我们可以轻而易举地制作一个getter:

function getFromPath(obj, pathArray) {
  var res = obj;
  for (var i=0; i<pathArray.length; i++) { res = res[pathArray[i]]; }
  return res;
}

我们将此称为getFromPath($obj, ["children",12,"children",32,"Name"]);

由于您希望将此getter函数转换为setter,因此您需要在倒数第二个对象上设置属性。我们可以通过提前停止循环一次,然后在对象上执行带有最终属性名称的set来完成此操作:

function setToPath(obj, pathArray, valueToSet) {
  var res = obj;

  // note the `length - 1` here: we don't go to the end of the path 
  for (var i=0; i<pathArray.length - 1; i++) { res = res[pathArray[i]]; }

  // res is now the second-to-last object in the path,
  // and we'll set the final value as a property on the object

  var finalKey = pathArray[pathArray.length-1];
  res[finalKey] = valueToSet;
}

我们将此称为setToPath($obj, ["children",12,"children",32,"Name"], "Dana");

或者,如果您只想使用getter来执行此操作,则可以将路径缩短一个项目并对getter的结果执行设置:

var secondToLast = getFromPath($obj, ["children",12,"children",32]);
secondToLast["Name"] = "Dana";