如何创建一个动态设置属性名的嵌套javascript对象

如何创建一个动态设置属性名的嵌套javascript对象,javascript,arrays,object,Javascript,Arrays,Object,我有一个javascript回调函数,它使用一组参数查询我的数据库。使用对象设置参数。如何动态设置其中一个属性的名称 现在我把它们都写出来了。它很好用,只是有点长。我只需要更改两个属性名的值。其中propertyNameToChange在我的示例代码中 var paramToChange = { /* I need to change the name of this property */ propertyNameToChange: { /* And the name of this

我有一个javascript回调函数,它使用一组参数查询我的数据库。使用对象设置参数。如何动态设置其中一个属性的名称

现在我把它们都写出来了。它很好用,只是有点长。我只需要更改两个属性名的值。其中propertyNameToChange在我的示例代码中

var paramToChange = { /* I need to change the name of this property */
    propertyNameToChange: { /* And the name of this property */
      url: { 
        ComparisonOperator: 'EQ',
        AttributeValueList: [{
          S: alreadySetWithVar /* This is already set using a var */
        }]
      }
    },
    TableName: 'ximoRep',
    IndexName: 'url-index'
  }
.... // I have about 10 of these written out. Then my callback function queries using an array using the var name for the object.

var params = [paramOne, paramTwo, paramThree, paramFour, paramFive, paramSix, paramSeven, paramEight]; 

Javascript没有更改属性名称的方法。您可以将一个特性指定给另一个新特性名称,然后删除原始特性

如果您有此数据结构:

var data = {
    prop1: {greeting: "hello"}
};
而且,如果要将
prop1
更改为
otherProp
,可以这样做:

data.otherProp = data.prop1;
delete data.prop1;
function renameProp(obj, oldPropName, newPropName) {
    var descriptor = Object.getOwnPropertyDescriptor(obj, oldPropName);
    Object.defineProperty(obj, newPropName, descriptor);
    delete obj.oldPropName;
}
这会将原始特性的值指定给新特性,然后删除原始特性

最终结果是:

var data = {
    otherProp: {greeting: "hello"}
};

用于执行此操作的通用函数甚至可以与具有特殊特性(如getter、setter或其他自定义属性)的属性一起使用,它将使用类似以下的propertyDescriptor:

data.otherProp = data.prop1;
delete data.prop1;
function renameProp(obj, oldPropName, newPropName) {
    var descriptor = Object.getOwnPropertyDescriptor(obj, oldPropName);
    Object.defineProperty(obj, newPropName, descriptor);
    delete obj.oldPropName;
}

这假设
oldPropName
属性是可配置的,并且对象没有冻结。

Javascript没有更改属性名称的方法。您可以将一个特性指定给另一个新特性名称,然后删除原始特性

paramToChange['newPropName'] = paramToChange['propertyNameToChange'];
delete paramToChange['propertyNameToChange'];
如果您有此数据结构:

var data = {
    prop1: {greeting: "hello"}
};
而且,如果要将
prop1
更改为
otherProp
,可以这样做:

data.otherProp = data.prop1;
delete data.prop1;
function renameProp(obj, oldPropName, newPropName) {
    var descriptor = Object.getOwnPropertyDescriptor(obj, oldPropName);
    Object.defineProperty(obj, newPropName, descriptor);
    delete obj.oldPropName;
}
这会将原始特性的值指定给新特性,然后删除原始特性

最终结果是:

var data = {
    otherProp: {greeting: "hello"}
};

用于执行此操作的通用函数甚至可以与具有特殊特性(如getter、setter或其他自定义属性)的属性一起使用,它将使用类似以下的propertyDescriptor:

data.otherProp = data.prop1;
delete data.prop1;
function renameProp(obj, oldPropName, newPropName) {
    var descriptor = Object.getOwnPropertyDescriptor(obj, oldPropName);
    Object.defineProperty(obj, newPropName, descriptor);
    delete obj.oldPropName;
}
这假定
oldPropName
属性是可配置的,并且对象没有冻结

paramToChange['newPropName'] = paramToChange['propertyNameToChange'];
delete paramToChange['propertyNameToChange'];
固定的


修复。

可能最好在以下情况下使用
propertyDescriptors
possible@PitaJ-如果您认为属性具有特殊属性,则额外的复杂性非常有用。如果它们只是普通属性,那么就没有必要了。我只是从一般意义上讲的。一个更通用的解决方案需要使用
propertyDescriptors
来真正覆盖所有的角度。@PitaJ-是的,我同意。只是一堆数据并不需要。@PitaJ-我添加了一个使用属性描述符的函数。当possible@PitaJ-如果您认为属性具有特殊属性,则额外的复杂性非常有用。如果它们只是普通属性,那么就没有必要了。我只是从一般意义上讲的。一个更通用的解决方案需要使用
propertyDescriptors
来真正覆盖所有的角度。@PitaJ-是的,我同意。只是不需要一堆数据。@PitaJ-我添加了一个使用属性描述符的函数。