#javascript
Вопрос:
У меня есть массив объектов в качестве возврата от вызова api. Теперь я хочу, чтобы данные были в формате массива объектов. Для этого я возвращаю функцию, но в моем выводе она показывает только последнее значение объекта, а не начальное
function(error, orders) {
if(!error){
let deliveryFee = 0;
let dateWiseData = [];
let dateWiseDataObject = {
dateWiseSum : 0,
orderCount : 0
};
for(let order of orders){
deliveryFee = order.deliveryFee deliveryFee;
if(moment(endDate).format('YYYY-MM-DD') === moment(order.createdAt).format('YYYY-MM-DD')){
dateWiseDataObject.dateWiseSum = order.deliveryFee dateWiseDataObject.dateWiseSum;
dateWiseDataObject.orderCount = 1 dateWiseDataObject.orderCount;
}else{
dateWiseData.push(dateWiseDataObject);
dateWiseDataObject.dateWiseSum = 0;
dateWiseDataObject.orderCount = 0;
endDate = moment(endDate, "YYYY-MM-DD").add(1,'days');
}
}
deliveryFee = (Math.round(deliveryFee * 100) / 100).toFixed(2);
let averageShippoAMount = deliveryFee/orders.length;
averageShippoAMount = (Math.round(averageShippoAMount * 100) / 100).toFixed(2);
let data = {
totalShippoAmount: deliveryFee,
totalShippoOrders: orders.length,
averageShippoAMount: averageShippoAMount
}
res.send(data)
}else{
console.log("something went wrong")
}
}
мои заказы, как показано ниже
[
{
"_id": "615156a25a49a90f34a98820",
"CRV": 0.05,
"__v": 0,
"address": {
"description": "address",
"_id": "6131b172242dd2113ac43f3b",
"nearestStore": "Abc",
},
"billingAddress": {
"description": "ABCD"
},
"creditCard": "card_",
"deliverNow": true,
"deliveryDate": null,
"deliveryDateObj": "2021-09-27T06:15:52.996Z",
"deliveryEndTime": null,
"deliveryFee": 11.24,
"deliveryNote": "",
"deliverySlot": "",
"deliveryStartTime": "now",
"owner": "60864a4e175bd51d86fb3e8d",
"selectedShippingObject": "53ccb767de264f56879f9c82e09fefe8",
"shippingTimeInHours": 0,
"strDeliveryEndTime": "23:29",
"strDeliveryStartTime": "22:29",
"tax": 0.64,
"tip": 0.67,
"tipPercentage": 10,
"updatedAt": "2021-09-27T05:29:11.418Z", "outForDeliveryAt": null,
"acceptedAt": null,
"assignedAt": null,
"approvedAt": "2021-09-27T05:29:11.417Z",
"completed": false,
"refunded": false,
"shippoOrder": true,
"createdAt": "2021-09-27T05:29:08.351Z",
"total": 19.29,
"subTotal": 6.74,
"qty": [
1
],
"products": [
"611c954c3fcd61ef71be2dea"
],
"status": "Approved"
},
{
....
}
]
Я сравниваю даты создания и для одной и той же даты, я пытаюсь добавить deliveryFee и количество заказов на конкретную дату и хочу вернуть массив объектов как с deliveryFee, так и с количеством заказов.
Я получаю вывод в виде [ { Исходные данные: 85,53, количество заказов: 8 } ] и ожидаю, что вывод будет [{Исходные данные: 47,77, количество заказов: 4}, {Исходные данные: 85,53, количество заказов: 8 }]
что касается моих данных, но я не знаю, что не так с кодом, любая помощь была бы очень признательна, спасибо заранее
Комментарии:
1. Не могли бы вы показать нам данные, которые не были введены?
2. Я имею в виду, что вводятся только значения конечного цикла
3. Я думаю, это потому, что вы не сохраняете исходный массив, а перезаписываете его с каждым элементом, который вы вводите. Я предполагаю, что вы имеете в виду, что в массив вводится только одно значение?
Ответ №1:
Я думаю, это потому, что вы не сохраняете исходный массив, а перезаписываете его с каждым элементом, который вы вводите. Я предполагаю, что вы имеете в виду, что в массив вводится только одно значение?
Если это так, это должно сохранить массив и переместить элементы в конец.
for(let order of orders){
deliveryFee = order.deliveryFee deliveryFee;
if(moment(endDate).format('YYYY-MM-DD') === moment(order.createdAt).format('YYYY-MM-DD')){
dateWiseDataObject.dateWiseSum = order.deliveryFee dateWiseDataObject.dateWiseSum;
dateWiseDataObject.orderCount = 1 dateWiseDataObject.orderCount;
}else{
dateWiseData.push([...dateWiseData, dateWiseDataObject]);
dateWiseDataObject.dateWiseSum = 0;
dateWiseDataObject.orderCount = 0;
endDate = moment(endDate, "YYYY-MM-DD").add(1,'days');
}
}
Ответ №2:
Проблема в том, что вы перезаписываете объект в массиве. Объект всегда находится в куче и передается по ссылке.
Вам нужно создать новый объект внутри локальной области и передать его в массив.
else {
dateWiseData.push({...dateWiseDataObject})
dateWiseDataObject.dateWiseSum = 0;
dateWiseDataObject.orderCount = 0;
}
или
else {
let newObject = {
dateWiseSum: dateWiseDataObject.dateWiseSum,
orderCount: dateWiseDataObject.orderCount
};
dateWiseData.push(newObject)
dateWiseDataObject.dateWiseSum = 0;
dateWiseDataObject.orderCount = 0;
}
Еще одна вещь, я думаю, что нашел ошибку в вашем коде. Когда вы проверяете дату в цикле, вы всегда пропускаете первый порядок следующей даты.
Вот мое решение (без библиотеки):
let orders = [
{
"deliveryFee": 11.24,
"createdAt": "2021-09-27T05:29:08.351Z"
},
{
"deliveryFee": 10.00,
"createdAt": "2021-09-27T05:29:08.351Z"
},
{
"deliveryFee": 9.10,
"createdAt": "2021-09-27T05:29:08.351Z"
},
{
"deliveryFee": 7.24,
"createdAt": "2021-09-28T05:29:08.351Z"
},
{
"deliveryFee": 4.24,
"createdAt": "2021-09-28T05:29:08.351Z"
},
{
"deliveryFee": 1.24,
"createdAt": "2021-09-28T05:29:08.351Z"
},
{
"deliveryFee": 25.24,
"createdAt": "2021-09-28T05:29:08.351Z"
}
];
let endDate = new Date("2021-09-27");
let deliveryFee = 0;
let dateWiseData = [];
let dateWiseDataObject = {
dateWiseSum : 0,
orderCount : 0
};
//This is the key function to add a new object to the array
function addDataToArray(dateWiseData, dateWiseDataObject){
dateWiseData.push({...dateWiseDataObject});
}
for(let order of orders){
let orderDate = new Date(order.createdAt);
if(endDate.getUTCDate() !== orderDate.getUTCDate()){
addDataToArray(dateWiseData, dateWiseDataObject);
dateWiseDataObject.dateWiseSum = 0;
dateWiseDataObject.orderCount = 0;
endDate = new Date(endDate.setTime(endDate.getTime() (24 * 60 * 60 * 1000)));
}
deliveryFee = order.deliveryFee deliveryFee;
dateWiseDataObject.dateWiseSum = Number((order.deliveryFee dateWiseDataObject.dateWiseSum).toFixed(2));
dateWiseDataObject.orderCount = 1 dateWiseDataObject.orderCount;
if(order === orders[orders.length-1]){
addDataToArray(dateWiseData, dateWiseDataObject)
}
}
//Display the data to the screen
let data = "";
dateWiseData.forEach((item)=>{
data = `{dateWiseSum: ${item.dateWiseSum}, orderCount: ${item.orderCount}}<br>`;
});
document.getElementById("container").innerHTML = data
<div id="container" ></div>