【问题标题】:Array.splice works, Lodash.remove doesn'tArray.splice 有效,Lodash.remove 无效
【发布时间】:2018-09-10 19:54:57
【问题描述】:

我正在使用mongoose 从数组中删除一个项目。一些代码:

const { find, remove } = require('lodash');

....

UserSchema.methods.deleteItem = async function (id) {
  const user = this;
  const item = find(user.items, i => i.id === id);
  const idx = user.items.indexOf(item);
  user.items.splice(idx, 1);

  // remove(user.items, i => i.id === id);

  try {
    await user.save();
    return item;
  } catch (err) {
    throw new Error(err);
  }
};

在上面的代码中,我使用了splice(),它可以正常工作。但是,lodash 的remove 不起作用。 .remove()documentation 表示它直接对数组进行变异,那为什么在这里不起作用?

【问题讨论】:

  • 您将其显示为 remove() 而不是 _.remove()。这是一个错字……还是答案?
  • @charlietfl 我也看到了find,所以我猜OP可能使用了const {find, remove} = _;
  • @zero298 啊……可能是对的。不过问也无妨
  • @zero298 是的,没错,很好。现在添加到问题中! :)
  • 我以前没有使用过 mongoose,但是没有理由让 lodash 的 remove 表现得像你描述的那样。所以,我有问题:1)你为什么不认为它有效? IE 您在哪里以及如何检查值而没有看到“预期”状态? 2)什么是user.items?它是一个普通的旧javascript数组还是猫鼬做了一些特殊的包装?

标签: javascript mongoose lodash


【解决方案1】:

简而言之,Mongoose 和 Lodash 似乎不兼容(至少对于这个用例而言)。


Mongoose 用自己的方法包装 Array.splice

请看Mongoose source的第568行

但是,Lodash 显式调用默认的 Array.splice,它绕过了包装版本。

请参阅(按顺序)Lodash source 的第 7847、7864、3857、3866、1484、1435 行

【讨论】:

    【解决方案2】:

    根据文档remove“返回删除元素的新数组”。因此,为了实现您想要的,您需要将调用的返回值分配给 user.items。

    https://lodash.com/docs/4.17.10#remove

    【讨论】:

    • “与 _.filter 不同,此方法会改变数组”
    猜你喜欢
    • 2021-02-27
    • 2014-07-14
    • 2020-02-02
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多