簡體   English   中英

Javascript 數組沒有以某種方式發生突變

[英]Javascript array is not somehow mutated

我有一個快遞服務器,我有 GET 和 POST,作為原始 state,我有以下內容:

let orders = [
        {
            sum: 0,
            purchases: [
                {
                    id: 1,
                    contractId: 55,
                    value: 100,
                },
                {
                    id: 2,
                    contractId: 55,
                    value: -100,
                }
            ]
        }
    ]
    
    // this function is running on GET request
    export const getOrders = (req, res) => {
    reply.status(200).send(orders)
    }

export const addOrder = (req, res) => {
const newOrder = req.body
orders.map((order) => {
    const correspondingorder = order.purchases.find(
        (purshase) => purshase.contractId === newOrder.contractId
    )
    if (correspondingorder) {

        order.purchases.push(newOrder)
        order.sum += newOrder.value
    } else {
        const newValues = { sum: newOrder.value, purchases: Array(newOrder) }
        orders.push(newValues)
    }
}

}

我的目的是在訂單列表中搜索是否存在新添加的訂單 ID,如果存在,則將其添加到相應的購買列表中,否則,創建一個包含總和和新訂單的新 object,但每當我嘗試添加具有相同 id 的新訂單,然后將其添加到找到的 contractID PLUS 創建一個包含總和和新訂單的新 object。

這是我在第一次 POST 和 GET 后得到的示例:

[
    {
        "sum": 100,
        "purchases": [
            {
                "id": 1,
                "contractId": 55,
                "value": 100
            },
            {
                "id": 2,
                "contractId": 55,
                "value": -100
            },
            {
                "id": 3,
                "contractId": 55,
                "value": 100
            }
        ]
    }
]

然后我第二次嘗試使用 POST 添加不同的訂單:

[
    {
        "sum": 100,
        "purchases": [
            {
                "id": 1,
                "contractId": 55,
                "value": 100
            },
            {
                "id": 2,
                "contractId": 55,
                "value": -100
            },
            {
                "id": 3,
                "contractId": 55,
                "value": 100
            }
        ]
    },
    {
        "sum": 100,
        "purchases": [
            {
                "id": 3,
                "contractId": 44,
                "value": 100
            }
        ]
    }
]

然后另一個帖子並得到了這個結果:

[
    {
        "sum": 100,
        "purchases": [
            {
                "id": 1,
                "contractId": 55,
                "value": 100
            },
            {
                "id": 2,
                "contractId": 55,
                "value": -100
            },
            {
                "id": 3,
                "contractId": 55,
                "value": 100
            }
        ]
    },
    {
        "sum": 200,
        "purchases": [
            {
                "id": 3,
                "contractId": 44,
                "value": 100
            },
            {
                "id": 4,
                "contractId": 44,
                "value": 100
            }
        ]
    },
    {
        "sum": 100,
        "purchases": [
            {
                "id": 4,
                "contractId": 44,
                "value": 100
            }
        ]
    }
]

知道為什么會發生這種奇怪的行為嗎?

這是因為 orders.map 返回一個新的 object 並且不會改變原始文件,您可以使用以下命令覆蓋原始文件:

orders = orders.map((order) => {
        const correspondingorder = order.purchases.find(
            (purshase) => purshase.contractId === newOrder.contractId
        )
        if (correspondingorder) {
            order.purchases.push(newOrder)
            order.sum += newOrder.value
        } else {
            const newValues = { sum: newOrder.value, purchases: Array(newOrder) }
            orders.push(newValues)
        }
    }
}

但老實說,我不建議在這種情況下改變對象,因為超過 1 個請求可以讀取/寫入該變量。

如果您確實需要使用這種方法,請使用 Array.forEach 並引用原始 object 而不是 map (返回一個新數組並且不會改變原始數組)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM