я хочу создать массив объектов на основе данных, которые я получаю в своем api

#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>