javascript - 当 console.log 位于函数调用之上时,函数得出正确的结论
问题描述
当 console.log 放在函数调用之上时,函数得出正确的结论。我不是在开玩笑,我通过删除和添加console.log 进行了多次检查。版本 node.js v16.4.2。输入正确。我还尝试在不同的环境中重现该问题,在没有 console.log 的情况下我得到了正确的输出。
async function styleQg(seance, date, durationSeance, questId, standardPrice) {
const dateNow = (new Date()).toISOString().split('T')[0]
seance = seance
.filter(e => durationSeance === "3600" ?
e.time.split(':')[1] === "00" :
e.time.split(":")[1].split("")[1] !== "5")
.map(e => ({date: date, ...e, price: standardPrice}))
if (date === dateNow) {
console.log(await expiredSeance(seance))
seance = await expiredSeance(seance)
}
return seance
}
async function expiredSeance(seance) {
seance = seance.map(e => {
if (e.time < new Date().toLocaleString("ru-RU", {timeZone: "Europe/Moscow"}).split(' ')[1]) {
return {...e, ...e.is_free = false}
} else {
return {...e}
}
})
return seance
}
输入数据(styleQg):
[
{ date: '2021-07-31', time: '10:00', is_free: true, price: 5000 },
{ date: '2021-07-31', time: '11:00', is_free: true, price: 5000 },
{ date: '2021-07-31', time: '12:00', is_free: false, price: 5000 },
{ date: '2021-07-31', time: '13:00', is_free: true, price: 5000 },
{ date: '2021-07-31', time: '14:00', is_free: true, price: 5000 },
{ date: '2021-07-31', time: '15:00', is_free: true, price: 5000 },
{ date: '2021-07-31', time: '16:00', is_free: true, price: 5000 },
{ date: '2021-07-31', time: '17:00', is_free: true, price: 5000 },
{ date: '2021-07-31', time: '18:00', is_free: true, price: 5000 },
{ date: '2021-07-31', time: '19:00', is_free: true, price: 5000 },
{ date: '2021-07-31', time: '20:00', is_free: true, price: 5000 },
{ date: '2021-07-31', time: '21:00', is_free: true, price: 5000 },
{ date: '2021-07-31', time: '22:00', is_free: true, price: 5000 }
]
输出数据(带有console.log):
[
{ date: '2021-07-31', time: '10:00', is_free: false, price: 5000 },
{ date: '2021-07-31', time: '11:00', is_free: false, price: 5000 },
{ date: '2021-07-31', time: '12:00', is_free: false, price: 5000 },
{ date: '2021-07-31', time: '13:00', is_free: false, price: 5000 },
{ date: '2021-07-31', time: '14:00', is_free: false, price: 5000 },
{ date: '2021-07-31', time: '15:00', is_free: false, price: 5000 },
{ date: '2021-07-31', time: '16:00', is_free: true, price: 5000 },
{ date: '2021-07-31', time: '17:00', is_free: true, price: 5000 },
{ date: '2021-07-31', time: '18:00', is_free: true, price: 5000 },
{ date: '2021-07-31', time: '19:00', is_free: true, price: 5000 },
{ date: '2021-07-31', time: '20:00', is_free: true, price: 5000 },
{ date: '2021-07-31', time: '21:00', is_free: true, price: 5000 },
{ date: '2021-07-31', time: '22:00', is_free: true, price: 5000 }
]
输出数据(无console.log):
[
{ date: '2021-07-31', time: '10:00', is_free: true, price: 5000 },
{ date: '2021-07-31', time: '11:00', is_free: true, price: 5000 },
{ date: '2021-07-31', time: '12:00', is_free: false, price: 5000 },
{ date: '2021-07-31', time: '13:00', is_free: true, price: 5000 },
{ date: '2021-07-31', time: '14:00', is_free: true, price: 5000 },
{ date: '2021-07-31', time: '15:00', is_free: true, price: 5000 },
{ date: '2021-07-31', time: '16:00', is_free: true, price: 5000 },
{ date: '2021-07-31', time: '17:00', is_free: true, price: 5000 },
{ date: '2021-07-31', time: '18:00', is_free: true, price: 5000 },
{ date: '2021-07-31', time: '19:00', is_free: true, price: 5000 },
{ date: '2021-07-31', time: '20:00', is_free: true, price: 5000 },
{ date: '2021-07-31', time: '21:00', is_free: true, price: 5000 },
{ date: '2021-07-31', time: '22:00', is_free: true, price: 5000 }
]
解决方案
问题是您在传播时正在做突变:{...e, ...e.is_free = false}
这不会将您分配给您创建的新对象的新值转移。相反,它只是更改了旧对象。Using...e.is_free = false
将尝试将赋值值传播到不做任何事情false
的对象中。
不是console.log
改变任何东西,而是调用该函数两次。第二次调用将使用更新后的值:
const x = { is_free: true };
//changes `x.is_free` to `false` but `y` already used the old value
const y = { ...x, ...x.is_free = false};
//changes `x.is_free` is already `false` so `z` gets that value
const z = { ...x, ...x.is_free = false};
console.log(x);
console.log(y);
console.log(z);
复制对象和更改值的正确{...e, is_free: false}
方法是不依赖任何突变和副作用:
const x = { is_free: true };
const y = { ...x, is_free: false};
const z = { ...x, is_free: false};
console.log(x);
console.log(y);
console.log(z);
推荐阅读
- c# - 如何在检查唯一值的同时将数据从一个表单插入到另一个表单的列表框中?
- r - 如何改变R中igraph中边缘的强度和对称性?
- react-native - 使用 react native fetch blob 库读取应用数据中的缓存文件
- swift - 我正在尝试通过 BLE 连接接收指示,但我无法接收任何数据
- arrays - 如何在 Julia 中将数组转换为数组?
- r - 在 Latex 中使用 R 内联代码进行循环
- node.js - 在 IBM Cloud 中使用持续集成时保留应用程序特定变量
- react-native - Exoplayer 使用离线许可证
- django - Django:在导航栏中列出类别
- python-3.x - 奥运会评委,打印最低和最高分国家评委的姓名