2015-08-24 2 views
1

У меня есть функция обратного вызова javascript, которая запрашивает мою базу данных с помощью набора параметров. Параметры устанавливаются с использованием объекта. Как я могу задать имя одного из свойств динамически?Как создать вложенный объект 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]; 

ответ

2

Javascript не имеет средств для изменения названия объекта недвижимости. Вы можете назначить одно свойство другому новому имени свойства, а затем удалить исходное свойство.

Если у вас есть эта структура данных:

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

И вы хотите изменить prop1 к otherProp, вы можете сделать это следующим образом:

data.otherProp = data.prop1; 
delete data.prop1; 

Это присваивает значение первоначального имущества к новому свойству, а затем удаляет исходное свойство.

Конечный результат:

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

Функция общего назначения для этого, что бы работать даже с СВОЙСТВАМИ, которые имеют особые характеристики, такие как добытчики, сеттера или другие пользовательские атрибуты будут использовать PropertyDescriptor как это:

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

Это предполагает oldPropName свойство настраивается и объект не заморожен.

+0

Возможно, лучше использовать 'propertyDescriptors', если возможно – PitaJ

+0

@PitaJ - это дополнительное усложнение полезно, если вы считаете, что свойства имеют специальные атрибуты. Если они просто обычные свойства, то нет необходимости. – jfriend00

+1

Я просто говорил в общем смысле. Более общее решение потребует использования 'propertyDescriptors', чтобы действительно покрыть все углы. – PitaJ

2
paramToChange['newPropName'] = paramToChange['propertyNameToChange']; 
delete paramToChange['propertyNameToChange']; 

Исправлено.

Смежные вопросы