javascript - 通过变量构建对象名称和属性
问题描述
我有这样的对象功能:
$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].selected
是pl
,eng
但用户可以更改它并添加新的或删除一个。
$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() 我只有将对象绑定到 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 也在突出显示它并说
: 期望相反。给定
解决方案
auction
您像这样初始化:
var auction = { auction: { langData: {} } };
但是您稍后会auction
通过执行来覆盖该属性
auction.auction = {
type: 'car',
layout: $scope.selected.description
};
这意味着 上不再有langData
属性auction.auction
。您可以重新创建该属性,或扩展该auction
属性以保留任何先前已存在的属性。
//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,
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]
}
});
推荐阅读
- vb.net - VB.Net - 序列化列表属性
- c - 尝试在 AIX 中动态加载 Oracle 客户端库时出错
- azure - 来自大查询和 Azure 数据工厂管道的数据映射问题
- javascript - 从禁用状态重新启用时,如何让 Chrome 扩展程序触发功能?
- javascript - TypeScript - 使用装饰器向类添加方法
- hadoop - Hadoop:HDFS 空间配额
- servicestack - ServiceStack 试图创建我自己的 OpenIdOAuthProvider 但 VS 2017 说缺少程序集 5.0.0.0
- java - 如何使用java从网站中提取流URL?
- javascript - 无法在使用 testcafe 的反应组件“类型搜索下拉列表”中输入文本
- android - 启动时仅启动前台服务,但不启动主要活动