【问题标题】:Using underscore.js to compare two Objects使用 underscore.js 比较两个对象
【发布时间】:2015-04-22 07:50:41
【问题描述】:

我正在尝试用下划线比较两个对象。

对象 1(过滤器)

{
  "tuxedoorsuit":"tuxedoorsuit-tuxedo",
  "occasions":"occasions-wedding"
}

对象 2(属性)

{
  "tuxedoorsuit":"tuxedoorsuit-tuxedo",
  "occasions":"occasions-wedding",
  "occasions":"occasions-prom",
  "product_fit":"product_fit-slim",
  "colorfamily":"colorfamily-black"
}

当在对象 2 中找到对象 1 的所有项目时,我想返回 true。对此使用的最佳下划线方法是什么?

【问题讨论】:

  • @ArnaldoIgnacioGasparVéjar:你应该这样回答。比目前公认的要好很多。
  • @Bergi :我同意isMatch 会好得多。但实际上有趣的是,它在这种情况下不起作用,因为“对象 2”格式不正确。它有两倍相同的属性occasionsisMatch 将“对象 2”转换为标准对象,这只会保留此属性的最后一个值:occasions-prom。然后它将返回false
  • @ArnaldoIgnacioGasparVéjar 啊,很好:) 我在我的回答中加入了isMatch。谢谢:)
  • @slaur4:事实上,对象语法格式错误会导致 parser 删除“first”值(或者,在严格模式下,抛出语法错误) . isMatch 不是这里的罪魁祸首,任何其他方法都可以同样工作 - 除非它将对象 2 作为 JSON 并在内部使用容错解析器。

标签: javascript object underscore.js


【解决方案1】:

编辑:根据Arnaldo's comment,你可以使用isMatch函数,像这样

console.log(_.isMatch(object2, object1));

描述说,

_.isMatch(object, properties)

告诉你 properties 中的键和值是否包含在 object.

如果你想自己迭代,就用_.keys_.every,像这样

_.every(_.keys(object1), function(currentKey) {
    return _.has(object2, currentKey) &&
                    _.isEqual(object1[currentKey], object2[currentKey]);
});

或链式版本,

var result = _.chain(object1)
    .keys()
    .every(function(currentKey) {
        return _.has(object2, currentKey) &&
            _.isEqual(object1[currentKey], object2[currentKey]);
    })
    .value();

如果结果为true,则表示object1中的所有键都在object2中,并且它们的值也相等。

这基本上遍历了object1中的所有键,并检查与object1中的键对应的值是否等于object2中的值。

【讨论】:

  • 如何在 _.filter 中使用它?
  • @Casey 请编辑问题并包含所有信息
  • 这很棒!我能够对其进行一些修改以在 _.filter() 中工作。谢谢!
  • 其实好像object1的第一项找到了,就不会检查第二项了。
  • @Casey JavaScript 对象是 HashMap 实现。因此,如果有两个项目映射到相同的 Hash 值,那么其中任何一个都将被另一个覆盖。
【解决方案2】:

使用 underscore.js 比较两个对象

 **isEqual :** _.isEqual(object, other) 

在两个对象之间执行优化的深度比较,以确定它们是否应该被视为相等。

例如:

var stooge = {name: 'moe', luckyNumbers: [13, 27, 34]};
    var clone  = {name: 'moe', luckyNumbers: [13, 27, 34]};
     _.isEqual(stooge, clone)  
      Returns True

【讨论】:

  • 虽然isEqual 非常有用,但如果另一个对象具有附加属性(例如 OP 的情况),它将不起作用。
  • 如果键的顺序不一样也不行:/
  • @zero_cool 键的顺序无关紧要。 JSON 只对数组排序,而不是哈希。
【解决方案3】:

基于之前的函数创建了简单的consoling out函数:

var compareMe = function (obj1, obj2, parentKey) {
  parentKey = parentKey || '';
  _.each(_.keys(obj1), function (key) {
    if(_.isObject(obj1[key]) ) {
        compareMe(obj1[key], obj2[key], parentKey + key + '.')
    } else {
        if (!_.has(obj2, key) || !_.isEqual(obj1[key], obj2[key])) {
            console.log(parentKey + key, obj1[key], obj2[key]);
        }
    }
  })
};

然后像这样调用:compareMe(obj1, obj1)

【讨论】:

    猜你喜欢
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-22
    • 2019-08-02
    • 2014-01-26
    • 2012-08-17
    相关资源
    最近更新 更多