首页 > 解决方案 > Javascript数组没有以某种方式变异

问题描述

我有一个快递服务器,我有 GET 和 POST,作为原始状态,我有以下内容:

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,如果存在,则将其添加到相应的购买列表中,否则,创建一个包含总和和新订单的新对象,但是每当我尝试添加具有相同 id 的新订单,然后将其添加到找到的 contractID 加上创建一个包含总和和新订单的新对象。

这是我在第一次 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
            }
        ]
    }
]

知道为什么会发生这种奇怪的行为吗?

标签: javascriptnode.jsexpress

解决方案


这是因为 orders.map 返回一个新对象并且不会改变原始对象,您可以使用以下命令覆盖原始对象:

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 并引用原始对象而不是 map (返回一个新数组并且不会改变原始数组)


推荐阅读