【问题标题】:Comparing two objects with undefined values using underscore.js使用 underscore.js 比较两个具有未定义值的对象
【发布时间】:2017-01-02 17:23:06
【问题描述】:

使用 underscore.js 我试图比较两个对象,如果它们相同,我想返回 true。为此,我使用 _.isEqual()。

var a = {0: "2", 1: "11", 2: "1"}
var b = {0: "2", 1: "11", 2: "1"}
_.isEqual(a, b) // returns true

按预期工作。我遇到的问题是,在给定时间我可能没有来自其中一个对象的所有数据。让我们使用这个例子:

var a = {0: "2", 1: undefined, 2: undefined}
var b = {0: "2", 1: "11", 2: "1"}
_.isEqual(a, b) // returns false

如果比较的某些值未定义,我想要一种方法(显然不使用 ._isEqual)来返回 true。有什么想法吗?

【问题讨论】:

  • 那么_.isAlmostEqual()?如果您只处理简单的、非嵌套对象(如所示对象),您只需大约四行代码即可编写自己的比较函数。如果您想允许嵌套对象,我相信您可以采用现有解决方案之一(包括 Underscore 的)并将其修改为忽略未定义的属性。
  • 我不认为这是一个下划线的方法......哈哈

标签: javascript jquery object underscore.js javascript-objects


【解决方案1】:

这是一个解决方案,首先确定哪些公共键具有定义的值,然后使用_.isEqual 进行比较:

var a = {0: "2", 1: undefined, 2: undefined}
var b = {0: "2", 1: "11", 2: "1"}

// helper predicate that returns true if the value passed to it is undefined
var notUndefined = _.negate(_.isUndefined);

// find the common keys that have defined values
var keys = _.intersection(_.keys(_.pick(a,notUndefined)), _.keys(_.pick(b,notUndefined)))

// compare only the common keys
var result = _.isEqual( _.pick(a, keys), _.pick(b, keys) );

NB 这仅在您的对象包含原始类型(无嵌套对象或数组)时才有效

【讨论】:

    猜你喜欢
    • 2015-04-22
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    • 2021-07-10
    • 2013-05-06
    • 1970-01-01
    相关资源
    最近更新 更多