首页 > 解决方案 > 当 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 }
]

标签: javascriptnode.js

解决方案


问题是您传播时正在做突变:{...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);


推荐阅读