web-dev-qa-db-ja.com

underscore.jsを使用して2つのオブジェクトを比較する

2つのオブジェクトをアンダースコアと比較しようとしています。

オブジェクト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"
}

Object 2内でObject 1のすべてのアイテムが見つかったときにtrueを返します。これに使用するのに最適なアンダースコアメソッドは何でしょうか。

16
Casey

編集:Arnaldoのコメント に従って、 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_の値と等しいかどうかを確認します。

27
thefourtheye

Underscore.jsを使用して2つのオブジェクトを比較するには

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

2つのオブジェクト間の最適化された詳細な比較を実行して、等しいと見なされるかどうかを判断します。

例:

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

単純なコンソールアウト関数を作成した以前の関数に基づいて:

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)

0
Dmitri Algazin