javascript - Vue.js - 在计算属性中迭代 json 以创建新对象
问题描述
这是 vue.js 中的计算属性:
shopCart() {
var scart = [],
group,
node;
scart.push({
payMethod: 0,
transactionReference: "",
RoomNumber: 0,
addressId: 0,
deliveryMinutes: 0,
comment: "",
posList: [],
});
for (var x = 0; x < this.items.length; x++) {
group = this.items[x].selectedOptions;
scart[0].posList.push({
articleId: this.items[x].id,
quantity: this.items[x].quantity,
singlePrice: this.items[x].price,
variantList: [],
parent: true,
name: this.items[x].name,
});
for (var y = 0; y < group.length; y++) {
node = group[y].options;
for (var z = 0; z < node.length; z++) {
scart[0].posList[0].variantList += node[z].id + ",";
}
}
}
scart = scart.map(function (e) {
return JSON.stringify(e);
});
scart = scart.join(",");
return scart;
},
它写入以下对象:
{
"payMethod": 0,
"transactionReference": "",
"RoomNumber": 0,
"addressId": 0,
"deliveryMinutes": 0,
"comment": "",
"posList": [
{
"articleId": 20001,
"quantity": 1,
"singlePrice": 8.99,
"variantList": "2001,4001,5001,2003,4003,",
"parent": true,
"name": "Fisch Filet"
},
{
"articleId": 20002,
"quantity": 1,
"singlePrice": 8.99,
"variantList": "",
"parent": true,
"name": "Cheese Burger"
}
]
}
我需要这个:
{
"payMethod": 0,
"transactionReference": "",
"RoomNumber": 0,
"addressId": 0,
"deliveryMinutes": 0,
"comment": "",
"posList": [
{
"articleId": 20001,
"quantity": 1,
"singlePrice": 8.99,
"variantList": "2001,4001,5001,",
"parent": true,
"name": "Fisch Filet"
},
{
"articleId": 20002,
"quantity": 1,
"singlePrice": 8.99,
"variantList": "2003,4003,",
"parent": true,
"name": "Cheese Burger"
}
]
}
最后一个嵌套循环仅将我的字符串写入“variantList”的第一次出现。我似乎找不到解决上一个循环中出现“variantList”的正确方法。有人能指出我正确的方向吗?
项目.json:
[
{
"id": 20001,
"name": "Fisch Filet",
"quantity": 1,
"selectedOptions": [
{
"id": 1,
"name": "Beilage",
"options": [
{
"id": 2001,
"optionQuantity": 1
}
]
},
{
"id": 2,
"name": "Salate",
"options": [
{
"id": 4001,
"optionQuantity": 1
}
]
},
{
"id": 3,
"name": "Ketchup/Mayo",
"options": [
{
"id": 5001,
"optionQuantity": 1
}
]
}
]
},
{
"id": 20002,
"name": "Cheese Burger",
"quantity": 1,
"selectedOptions": [
{
"id": 1,
"name": "Beilage",
"options": [
{
"id": 2003,
"optionQuantity": 1
}
]
},
{
"id": 2,
"name": "Salate",
"options": [
{
"id": 4003,
"optionQuantity": 1
}
]
}
]
}
]
解决方案
根据输入的项目和所需的结果,我建议使用以下解决方案map
:
shopCart() {
var scart = [],
group,
node;
scart.push({
payMethod: 0,
transactionReference: "",
RoomNumber: 0,
addressId: 0,
deliveryMinutes: 0,
comment: "",
posList: this.items.map(item=>{
item={
articleId: item.id,
quantity: item.quantity,
singlePrice:item.price,
variantList:item.selectedOptions.map(opt=>opt.options[0].id).join(),
parent: true,
name: item.name,
};
return item;
}) ,
});
return scart;
}
推荐阅读
- github - 如何以编程方式阻止 GitHub PR 合并
- grafana - 使用 kubeflow 的 Grafana
- unity3d - Unity 上的项目路径无效
- c# - ADODB.Command,查找满足条件的行
- javascript - 单击导航栏中的锚链接后平滑滚动到 div 容器(将 div 容器居中在视口/屏幕的中间)
- c - Seg Fault 在指针数组上调用 mergesort
- php - Laravel 7. 如何在laravel中使用外键从各个表中获取记录?
- flutter - 如何在不占用 GridView 任何空间的情况下从 UI 中隐藏小部件
- spring - 缺少 Swagger2 UI 资源映射和 API 文档
- git - Gitlab无法打开目录