我有嵌套对象,例如:
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;
但这很丑。有更好的方法吗?
答案 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