Javascript 如何将字符串用作更新对象的键
我试图创建一个函数,该函数接受对象中的路径,并将其作为键 例如,如果我想更新城市,这是一家公司的子对象,这是一个财产的子对象,我可以这样做: originalObj['property']['company']['city']=test 以下是我目前的代码:Javascript 如何将字符串用作更新对象的键,javascript,Javascript,我试图创建一个函数,该函数接受对象中的路径,并将其作为键 例如,如果我想更新城市,这是一家公司的子对象,这是一个财产的子对象,我可以这样做: originalObj['property']['company']['city']=test 以下是我目前的代码: function updateObj(path, value){ let valuePath = path.split(',') let key='' for(let i=0; i<valuePath.length ; i
function updateObj(path, value){
let valuePath = path.split(',')
let key=''
for(let i=0; i<valuePath.length ; i++){
key = key+`[valuePath[${i}]]`
}
//key = [valuePath[0]] [valuePath[1]] [valuePath[2]]
originalObj[key] = value
}
setObj('property,company,city', test)
函数更新bj(路径,值){
让valuePath=path.split(','))
让键=“”
对于(设i=0;i),您可以保存路径的最后一个关键点,并使用临时对象获取用于赋值的最终对象
函数更新bj(路径,值){
var valuePath=path.split(','),
last=valuePath.pop(),
温度=对象;
for(设i=0;i
尝试以下操作:
function setObj(originalObj, path, value){
var parts = path.split(',');
var lastKey = parts.pop();
var obj = originalObj;
parts.forEach(
function(key) {
key = key.trim();
obj[key] = obj[key] || {};
obj = obj[key];
}
);
obj[lastKey] = value;
}
var originalObj = {};
var test = "This is a test";
setObj(originalObj, 'property,company,city', test)
console.log(JSON.stringify(originalObj,0,2));
它遍历您的列表并为除最后一个之外的所有对象创建子对象。然后它使用最后一个作为键来存储值
这段代码的优点是您不采用原始对象变量名。而且,如果您希望它是纯的并且不影响原始对象结构,那么您可以进行以下细微更改:
function setObj(originalObj, path, value){
var parts = path.split(',');
var lastKey = parts.pop();
var newObj = Object.assign({}, originalObj);
var obj = newObj;
parts.forEach(
function(key) {
obj[key] = Object.assign({}, obj[key] || {});
obj = obj[key];
}
);
obj[lastKey] = value;
return newObj;
}
var originalObj = {animals: {dog:"bark",cat:"meow"},property:{company:{name:"Fred's Things"}}};
var test = "This is a test";
var result = setObj(originalObj, 'property,company,city', test)
console.log(JSON.stringify(originalObj,0,2));
console.log(JSON.stringify(result,0,2));
哦,很有意思。这并不难,但在JavaScript 101课程中,这是一个很好的家庭作业练习。你尝试了什么…问题是什么?这是一个惊人的单行程序,不应该在任何代码中使用。冗余split@intervalia比要缓存的声明或生命还要短it@derek这同样适用于这个问题一般来说,不是吗?@JonasW。我可以从中看到一些合法的用途。
function setObj(originalObj, path, value){
var parts = path.split(',');
var lastKey = parts.pop();
var newObj = Object.assign({}, originalObj);
var obj = newObj;
parts.forEach(
function(key) {
obj[key] = Object.assign({}, obj[key] || {});
obj = obj[key];
}
);
obj[lastKey] = value;
return newObj;
}
var originalObj = {animals: {dog:"bark",cat:"meow"},property:{company:{name:"Fred's Things"}}};
var test = "This is a test";
var result = setObj(originalObj, 'property,company,city', test)
console.log(JSON.stringify(originalObj,0,2));
console.log(JSON.stringify(result,0,2));