使用underscore.js比较两个对象

时间:2015-02-20 15:16:52

标签: javascript object underscore.js

我试图用下划线比较两个对象。

对象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。对此最好的下划线方法是什么?

3 个答案:

答案 0 :(得分:26)

修改:根据Arnaldo's comment,您可以使用isMatch功能,就像这样

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

描述说,

  

_.isMatch(object, properties)

     

告诉您属性中的键和值是否包含在对象中。

如果您想自己迭代,只需使用_.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中的值。

答案 1 :(得分:8)

使用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

答案 2 :(得分:0)

基于以前的功能创建简单的安慰功能:

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)