javascript - 通过变量构建对象名称和属性

标签 javascript object

我有这样的对象函数:

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

$scope.langInput.values[i].selectedpleng但用户可以更改它并添加新的或删除一个。 $scope.inputs.auction_name_account[i + 1]是用户提供的上述语言的描述。此外,如果用户更改上述语言,他必须以他选择的语言提供描述。

控制台数据很好,但我不知道如何构建这个对象,所以在函数完成工作后,它看起来像这样:

{  
   "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() 我只是在将对象绑定(bind)到 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));
}

我仍然遇到语法错误:

Uncaught SyntaxError: Unexpected token .

从这一行开始

$scope.langInput.values.selected: {我的 IDE 也突出显示它并说

: expected instead . given

最佳答案

您像这样初始化了拍卖:

var auction = { auction: { langData: {} } };

但是您稍后可以通过以下操作覆盖 auction 属性

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]
};

否则,如果它应该是一个数组,您需要将其更改为一个数组,然后您可以使用computed property names创建您的对象

auction.auction = {
  type: 'car',
  layout: $scope.selected.description,
  langData:[] //<-- array instead of object
};

/*...*/
auction.auction.langData.push({
  [$scope.langInput.values[i].selected]:{ //<--computed name syntax
    name:$scope.inputs.auction_name_account[i + 1]
  }
});

关于javascript - 通过变量构建对象名称和属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51181681/

相关文章:

Javascript 定义对象,逗号大小写

java - 当我尝试将对象添加到 ArrayList 时,它添加了哈希码,不知道如何解决。初学者

javascript - 我需要计算网页中具有特定值 "src"的图像并填充输入字段并使用脚本自动提交页面

JavaScript 执行 block 和消息队列

javascript - 从 websocket 播放 OPUS 时的声音调度问题

javascript - 遍历在nodeJs中具有嵌套对象的对象

javascript - 更改对象数组中的键 || javascript

javascript - JSON stringify 在从 Dreamweaver 预览时有效,但在创建应用程序时不能从 .AIR 文件预览

javascript - jQuery回调函数检查元素点击时子元素的数量

html - 嵌入带有参数的 svg 对象