我有这样的对象函数:
$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() 我只是在将对象绑定(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/