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を返します。これに使用するのに最適なアンダースコアメソッドは何でしょうか。
編集: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
_の値と等しいかどうかを確認します。
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
単純なコンソールアウト関数を作成した以前の関数に基づいて:
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)