如何通过更改键为嵌套对象分配值?

时间:2018-09-12 17:56:17

标签: javascript eval

我有嵌套对象,例如:

var a = {b: {c: {d: 1}}};

和一个动态键:

var field = "b.c.d"

我需要通过键a更改对象b.c.d上的值。对象和键的嵌套级别可以有所不同。 对我唯一有用的是:

eval("a."+field+"=2"); -> it means a.b.c.d = 2;

但这很丑。有更好的方法吗?

5 个答案:

答案 0 :(得分:3)

您可以尝试使用递归函数

var a = {b: {c: {d: 1}}};
var field = "b.c.d";
var value = 2;

function updateObject(obj, key, val){
  if(obj) {
    if(key.includes(".")) {
      var keys = key.split(".");
      updateObject(obj[keys.shift()], keys.join("."), val);
    } else if (obj.hasOwnProperty(key)) obj[key] = val;
  }
}

updateObject(a, field, value);

console.log(a);

答案 1 :(得分:1)

您可以简单地使用递归函数来更新值:

var a = {b: {c: {d: 1}}};
function updateValue(obj, path,value){
  if(typeof path == "string")
    path = path.split(".");
   if(path.length == 1)
    obj[path[0]] = value;
   else
    updateValue(obj[path[0]], path.slice(1), value);
}

updateValue(a, "b.c.d", 2);
console.log(a);

答案 2 :(得分:1)

这是另一种解决方案,以防万一您必须多次使用相同的路径并想要创建一个可以用来设置值的函数:

var a = {b: {c: {d: 1}}};

function createSetter(path) {
  return path.split(".")
    .reverse()
    .reduce((setter, key) => 
        (setter
          ? (o,value) => setter(o[key],value)
          : (o,value) => o[key]=value
        ), null)
}
  
var myBCDSetter = createSetter("b.c.d")

myBCDSetter(a,2)
console.log(a)

myBCDSetter(a,3)
console.log(a)

答案 3 :(得分:0)

您可以使用lodash _.set(object, path, value)。就您而言,_.set(a, "b.c.d", 2)

请参阅文档here

答案 4 :(得分:0)

您可以使用Function构造函数,它也可以用于数组:

Sub FillMail()

    Dim rstMail As DAO.Recordset
    Dim rstIsin As DAO.Recordset

    Dim db As Database
    Dim isinarray As Variant

    Set rstMail = Forms!Transfert.RecordsetClone
    Set rstIsin = Forms!TFT_ISIN_DatasheetSub2.RecordsetClone
    Set db = CurrentDb

    rstMail.Bookmark = Forms!Transfert.Bookmark
    rstIsin.Bookmark = Forms!TFT_ISIN_DatasheetSub2.Bookmark

    isinarray = rstIsin.GetRows

    MsgBox isinarray(2, 0)

End Sub