Javascript 按变量生成对象名称和属性

Javascript 按变量生成对象名称和属性,javascript,object,Javascript,Object,我有一个与对象相关的函数,如下所示: $scope.createAuction = function () { var auction = { auction: { langData: {} } }; if($scope.selected.tab === $scope.infoTabs[0]) { auction.auction = { type: 'car', layout: $scope.selected.de

我有一个与对象相关的函数,如下所示:

$scope.createAuction = function () {
    var auction = { auction: { langData: {} } };

    if($scope.selected.tab === $scope.infoTabs[0]) {
        auction.auction = {
            type: 'car',
            layout: $scope.selected.description
        };
        if(auction.auction.layout === 1) {
            for(var i = 0, l = $scope.langInput.values.length; i < l; i++) {
                /*
                auction.auction.langData.push({
                    $scope.langInput.values.selected: {
                        name: $scope.inputs.auction_name_account[i + 1]
                    }
                });
                */
                console.log($scope.inputs.auction_name_account[i + 1]);
                console.log($scope.langInput.values[i].selected);
            }
        }
    }
    console.log(JSON.stringify(auction));
}
{  
   "auction":{  
      "type":"account",
      "layout":1
      "langData":{
          "pl":{
              "name":"description in polish provided by user"
          } 
          "eng":{
              "name":"description in english provided by user"
          }
      }
   }
}
我试图用/*…*/中的代码构建它但如果给我语法错误,它就不起作用了

我知道下面的JSON是另一个,而上面的对象是另一个,但这并不重要,稍后我将使用JSON.stringify,我只是在将对象绑定到langData对象时遇到问题

编辑

正如@Patrick Evans建议的那样,我已经更改了代码,因此我不再在代码中覆盖它,现在它是:

$scope.createAuction = function () {
    var auction = { auction: { langData: {} } };

    if($scope.selected.tab === $scope.infoTabs[0]) {
        Object.assign(auction.auction, {
          type: 'account',
          layout: $scope.selected.description
        });
        if(auction.auction.layout === 1) {
            //alert($scope.langInput.values.length);
            for(var i = 0, l = $scope.langInput.values.length; i < l; i++) {
                auction.auction.langData.push({
                    $scope.langInput.values.selected: {
                        name: $scope.inputs.auction_name_account[i + 1]
                    }
                });
                console.log($scope.inputs.auction_name_account[i + 1]);
                console.log($scope.langInput.values[i].selected);
            }
        }
    }
    if($scope.selected.tab === $scope.infoTabs[1]) {}
    if($scope.selected.tab === $scope.infoTabs[2]) {}
    console.log(JSON.stringify(auction));
}
我仍然收到语法错误:

未捕获的语法错误:意外标记

从这一行

$scope.langInput.values.selected:{我的IDE也在高亮显示它并显示

:应改为。给定

你是这样说的:

但随后您将通过执行以下操作覆盖拍卖属性

auction.auction = {
  type: 'car',
  layout: $scope.selected.description
};
这意味着auction.auction上不再有langData属性。您可以重新创建该属性,或扩展该拍卖属性,保留以前存在的任何属性

//recreate the property
auction.auction = {
  type: 'car',
  layout: $scope.selected.description,
  langData:{}
};
//or extend the property
Object.assign(auction.auction,{
  type:'car',
  layout:$scope.selected.description,
});
//or extend by explicitly setting each property
auction.auction.type = 'car';
auction.auction.layout = $scope.selected.description,
对于实际将数据放在langData上,这取决于您希望它是什么

如果它是一个对象,您可以将该变量用作属性访问器并进行设置

//if you actually meant to use $scope.langInput.values.selected
auction.auction.langData[$scope.langInput.values[i].selected] = {
  name: $scope.inputs.auction_name_account[i + 1]
};
//or if values is an array
let propName = $scope.langInput.values[i];
auction.auction.langData[propName] = {
  name: $scope.inputs.auction_name_account[i + 1]
};
否则,如果它应该是数组,则需要将其更改为数组,然后可以使用

你是这样说的:

但随后您将通过执行以下操作覆盖拍卖属性

auction.auction = {
  type: 'car',
  layout: $scope.selected.description
};
这意味着auction.auction上不再有langData属性。您可以重新创建该属性,或扩展该拍卖属性,保留以前存在的任何属性

//recreate the property
auction.auction = {
  type: 'car',
  layout: $scope.selected.description,
  langData:{}
};
//or extend the property
Object.assign(auction.auction,{
  type:'car',
  layout:$scope.selected.description,
});
//or extend by explicitly setting each property
auction.auction.type = 'car';
auction.auction.layout = $scope.selected.description,
对于实际将数据放在langData上,这取决于您希望它是什么

如果它是一个对象,您可以将该变量用作属性访问器并进行设置

//if you actually meant to use $scope.langInput.values.selected
auction.auction.langData[$scope.langInput.values[i].selected] = {
  name: $scope.inputs.auction_name_account[i + 1]
};
//or if values is an array
let propName = $scope.langInput.values[i];
auction.auction.langData[propName] = {
  name: $scope.inputs.auction_name_account[i + 1]
};
否则,如果它应该是数组,则需要将其更改为数组,然后可以使用


好的,这是使它工作的第一步,但我的问题是关于将对象放入langData对象,而你没有说任何关于它的话。我已经更改了代码,现在我使用object.assign,但是将pl、eng等对象推入auction.auction.langData如何?@BT101我知道你的另一个问题是什么,我会在几分钟内以适当的步骤更新答案是的,我的意思是langData是一个包含对象的数组,我在“编辑”中显示了我的错误,但仍然存在。@BT101编辑了答案,以说明langData是一个对象还是一个数组。至于语法错误,是因为您试图使用对象/属性/变量作为属性名称,但语法错误,我认为是错误的w editOk中的正确用法这是使其工作的第一步,但我的问题是关于将对象放入langData对象,而您没有对此发表任何意见。我已更改代码,现在我使用object.assign,但将pl、eng等对象推入auction.auction.langData如何?@BT101我知道您的另一个问题是什么,将更新an用适当的步骤回答几句是的,你说得对,我的意思是langData是一个包含对象的数组,我在“编辑”中显示了我的错误,但仍然存在。@BT101编辑了答案,以说明langData是一个对象还是一个数组。至于语法错误,是因为你试图使用对象/属性/变量作为属性名我在编辑中显示了正确用法的错误语法