Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将字符串用作更新对象的键_Javascript - Fatal编程技术网

Javascript 如何将字符串用作更新对象的键

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

我试图创建一个函数,该函数接受对象中的路径,并将其作为键

例如,如果我想更新城市,这是一家公司的子对象,这是一个财产的子对象,我可以这样做: originalObj['property']['company']['city']=test

以下是我目前的代码:

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