【问题标题】:How to merge javascript object containing symbols?如何合并包含符号的javascript对象?
【发布时间】:2020-06-21 04:55:55
【问题描述】:

我正在尝试使用 lodash 合并来合并两个对象,但它不适用于符号。有没有替代的实用程序?

    import {merge} from 'lodash';
    import {Op} from 'sequelize';

    const selectA = {
        where: {
            text: "something"
        }
    };

    const selectB = {
        where: {
            date_from: {
                [Op.lt]: Sequelize.literal('NOW()')
            }
        }
    };

    console.log(_.merge(selectA, selectB));

输出:

{ where: { text: 'something', date_from: {} } }

【问题讨论】:

  • 不知道sequelize,但如果它适用于sequelize,您可以将“date_from”添加到selectA Object。 selectA.where.date_from = { [Op.lt]: Sequelize.literal('NOW()') }
  • 不,我不能。我想以编程方式进行。

标签: javascript node.js typescript merge lodash


【解决方案1】:

您可以使用_.mergeWith() 并提供一个使用spread 的合并函数。

注意:查看浏览器的控制台。 sn-p 的控制台不显示符号。

const Op = {
  lt: Symbol('symbol')
}

const selectA = {
  num: 15,
  where: {
    text: "something"
  }
};

const selectB = {
  num: 30,
  where: {
    date_from: {
      [Op.lt]: 'symbol value'
    }
  }
};

const result = _.mergeWith(selectA, selectB, (a, b) => {
  if (!_.isObject(b)) return b;
  
  return Array.isArray(a) ? [...a, ...b] : { ...a, ...b }
});

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>

【讨论】:

  • 酷,行得通!您能否解释一下为什么这会消耗符号而另一个(简单合并)不会?
  • 因为内部合并使用for...in 循环(通过_.keysIn())函数)来迭代对象,并且for...in 忽略符号。通过 spread 进行的浅拷贝也包含符号,因此我们将默认的 _.mergeWith() 浅合并替换为我们自己的函数,同时保留深度合并的能力。
  • 哦,我明白了,有道理。我只是注意到这种合并不适用于数字。尝试替换 const selectA = { my_bool: false } 和 const selectB = { num: 123 }。我在合并结果中得到{ my_bool: false, num: {} }(缺少数字)。
  • 这是一个非常幼稚的合并函数实现。您可以扩展它以识别基元并分配它们而不是合并,并处理其他类型的对象。看_.merge()的源码,看看它处理了多少案例。
  • 但是符号是原始类型。它怎么会消耗符号,但仍然以_.merge() 的方式与其他东西一起运行?
【解决方案2】:

使用 deepmerge 代替 lodash https://www.npmjs.com/package/deepmerge

【讨论】:

  • 谢谢,我没有尝试使用符号,但它可能会完成这项工作。我也找到了 [merge-options] (npmjs.com/package/merge-options) pkg,但不想添加越来越多的 pkg。
  • 我已经尝试过使用符号进行 deepmerge,它可以工作,并推荐它,因为它很小并且没有其他依赖项,我们都讨厌包含许多 node_modules,但正如我在上面看到的那样,有决定与 lodash,所以最好留在它 :)
猜你喜欢
  • 1970-01-01
  • 2017-01-16
  • 2019-07-23
  • 1970-01-01
  • 2016-07-13
  • 2022-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多