javascript - 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
}
]
}
]
知道为什么会发生这种奇怪的行为吗?
解决方案
这是因为 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 (返回一个新数组并且不会改变原始数组)
推荐阅读
- mongodb - 有没有像 sql 数据库的实体关系图这样的 nosql 数据库的数据库图设计?
- javascript - 我很困惑,我的代码不断收到此错误“Uncaught TypeError: document.getElementById(...) is null”我做错了什么
- docker - 搬运工的问题
- html - 提供唯一 ID \ 名称时出现材料日期选择器错误
- pandas - 当列是列表或集合时,重新映射 Pandas 列中的值
- maven - 使用 maven 修改 POM 文件的设置以支持 Artifactory 上的访问令牌
- microsoft-graph-api - 当某个配置或策略停止应用于 intune 上的设备时,是否有办法获取警报
- swift - 命令行工具如何打印帮助文本并通过管道自动获取更多命令的行为?
- python - Django 仅返回默认图像 URL
- flutter - 在颤振中条件为真后如何弹出页面?