这个JSON是以订单的形式提供的,其中包含多个与vendorId相关的产品。我希望能够将其分组到一个独立的数组集合中,而不是将所有产品都作为一个长集合列出。我如何才能做到这一点?
我的代码
let order = {
"products": [
{
"_id": "5e989346731e4d11c4a06331",
"productId": "5e9ee6ad8ac51f4654846552",
"vendorId": "5e8547fb14033339a86cc349",
"name": "Laterral",
"price": 1000,
"count": 2
},
{
"_id": "5e990589823c501e640be183",
"productId": "5e989346731e4d11c4a06331",
"vendorId": "5e8547fb14033339a86cc349",
"name": "ANother Product",
"price": 12453,
"count": 3
},
{
"_id": "5e9ee6ad8ac51f4654846552",
"productId": "5e989346731e4d11c4a06331",
"vendorId": "5e8547fb14033339a86cc309",
"name": "ANother Product",
"price": 12453,
"count": 3
},
{
"_id": "5e9904c3cd559006fc2b92b3",
"productId": "5e989346731e4d11c4a06331",
"vendorId": "5e8547fb14033339a86cc309",
"name": "ANother Product",
"price": 12453,
"count": 3
}
],
"address":"Colonel 10",
"amount":"234555",
"transaction_id":"3334hdd",
"status":"Not processed"
}
let products = order.products
//console.log(products)
arr = []
products.map(product => {
vendorId = product.vendorId
price = product.price
quantity = product.count
productId = product.productId
if(vendorId == product.vendorId) {
arr.vendorId = vendorId
arr.productId = productId
arr.price = price
arr.count = quantity
arr.total = price * quantity; //arr.reduce((cum, xtr) => cum + xtr.price * xtr.count,0)
tem = "========= \n " +arr.count+" Products ordered from this vendor " + vendorId + "\n" + arr.productId +" for "+ arr.price + " Total of " + arr.total;
}
console.log(arr)
})
This is my output
[
vendorId: '5e8547fb14033339a86cc349',
productId: '5e9ee6ad8ac51f4654846552',
price: 1000,
count: 2,
total: 2000
]
[
vendorId: '5e8547fb14033339a86cc349',
productId: '5e989346731e4d11c4a06331',
price: 12453,
count: 3,
total: 37359
]
[
vendorId: '5e8547fb14033339a86cc309',
productId: '5e989346731e4d11c4a06331',
price: 12453,
count: 3,
total: 37359
]
[
vendorId: '5e8547fb14033339a86cc309',
productId: '5e989346731e4d11c4a06331',
price: 12453,
count: 3,
total: 37359
]
This is my intended output
"order":{
"vendor":[
{
"productId":"5e9ee6ad8ac51f4654846552",
"price":1000,
"count":2,
"total":2000
},
{
"productId":"5e989346731e4d11c4a06331",
"price":12453,
"count":3,
"total":37359
}
],
"vendorId":"5e8547fb14033339a86cc349",
"gtotal":39359,
"vendor":[
{
"productId":"5e989346731e4d11c4a06331",
"price":12453,
"count":3,
"total":37359
},
{
"productId":"5e989346731e4d11c4a06331",
"price":12453,
"count":3,
"total":37359
}
],
"vendorId":"5e8547fb14033339a86cc309",
"gtotal":74718
}
解决这个问题的最佳方法是什么?
发布于 2020-05-10 06:47:27
这不会产生所需的输出,因为所需的输出是完全无效的
但这几乎就是我想要的
let order={"products":[{"_id":"5e989346731e4d11c4a06331","productId":"5e9ee6ad8ac51f4654846552","vendorId":"5e8547fb14033339a86cc349","name":"Laterral","price":1000,"count":2},{"_id":"5e990589823c501e640be183","productId":"5e989346731e4d11c4a06331","vendorId":"5e8547fb14033339a86cc349","name":"ANother Product","price":12453,"count":3},{"_id":"5e9ee6ad8ac51f4654846552","productId":"5e989346731e4d11c4a06331","vendorId":"5e8547fb14033339a86cc309","name":"ANother Product","price":12453,"count":3},{"_id":"5e9904c3cd559006fc2b92b3","productId":"5e989346731e4d11c4a06331","vendorId":"5e8547fb14033339a86cc309","name":"ANother Product","price":12453,"count":3}],"address":"Colonel 10","amount":"234555","transaction_id":"3334hdd","status":"Not processed"};
const products = order.products;
const vendor = products.reduce((acc, {productId, price, count, vendorId}) => {
let total = price * count;
let existing_vendor = acc.find(i => i.vendorId === vendorId);
if (!existing_vendor) {
acc.push({products:[{productId, price, count, total}], vendorId, gtotal:total});
} else {
existing_vendor.products.push({productId, price, count, total});
existing_vendor.gtotal += total;
}
return acc
}, []);
const result = {order: {vendor}};
console.log(result);
发布于 2020-05-10 07:01:06
根据我从您的问题和所需的输出json中所理解的,我觉得这可能适合您期望的输出json结构。
const orders = {
"products": [
{
"_id": "5e989346731e4d11c4a06331",
"productId": "5e9ee6ad8ac51f4654846552",
"vendorId": "5e8547fb14033339a86cc349",
"name": "Laterral",
"price": 1000,
"count": 2
},
{
"_id": "5e990589823c501e640be183",
"productId": "5e989346731e4d11c4a06331",
"vendorId": "5e8547fb14033339a86cc349",
"name": "ANother Product",
"price": 12453,
"count": 3
},
{
"_id": "5e9ee6ad8ac51f4654846552",
"productId": "5e989346731e4d11c4a06331",
"vendorId": "5e8547fb14033339a86cc309",
"name": "ANother Product",
"price": 12453,
"count": 3
},
{
"_id": "5e9904c3cd559006fc2b92b3",
"productId": "5e989346731e4d11c4a06331",
"vendorId": "5e8547fb14033339a86cc309",
"name": "ANother Product",
"price": 12453,
"count": 3
}
],
"address":"Colonel 10",
"amount":"234555",
"transaction_id":"3334hdd",
"status":"Not processed"
}
const formattedProducts = orders.products.reduce((result, product) => {
const vendorObj = result.find(r => r.vendor.vendorId === product.vendorId);
if(vendorObj) {
vendorObj.vendor.products.push(product);
vendorObj.vendor.total += product.price
} else {
result.push({"vendor": {products: [product], vendorId: product.vendorId, total: product.price}})
}
return result
}, [])
const result = {orders:[...formattedProducts]}
console.log(result)
在最终输出中,在供应商数组中,每个产品都具有与输入中相同的信息。如果不需要所有的值,则可以删除它们。但只是为了保持他们在那里,我没有删除或没有添加,只有那些你正在寻找的。
https://stackoverflow.com/questions/61707790
复制