2015-02-20 2 views
12

Я пытаюсь сравнить два объекта с подчеркиванием.Использование 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" 
} 

Я хочу, чтобы вернуться верно, когда все элементы объекта 1 находятся в пределах объекта 2. Что был бы лучшим методом подчеркивания для этого?

+4

насчет HTTP: // underscorejs .org/# isEqual и http://underscorejs.org/#isMatch? –

+1

@ ArnaldoIgnacioGasparVéjar: Вы должны ответить на этот вопрос. Это намного лучше, чем принято в настоящее время. – Bergi

+0

@Bergi: Я согласен, что 'isMatch' будет намного лучше. Но на самом деле интересно отметить, что в этом случае это не сработает, потому что «Объект 2» искажен. Он имеет в два раза то же свойство «случаев».[isMatch] (http://underscorejs.org/docs/underscore.html#section-106) отбрасывает «Объект 2» в стандартный объект, и это будет содержать только последнее значение этого свойства: 'timesions-prom'. Затем он вернет 'false'. – slaur4

ответ

20

Edit: По 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.

+0

Как использовать это внутри _.фильтра? – Casey

+0

@Casey Пожалуйста, отредактируйте этот вопрос и включите всю информацию – thefourtheye

+0

Это сработало отлично! Мне удалось немного изменить его для работы внутри _.filter(). Благодаря! – Casey

6

Для сравнения двух объектов с помощью underscore.js

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

выполняет оптимизированную глубокое сравнение между двумя объектами, чтобы определить, следует ли их считать равными.

Ex:

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

В то время как 'isEqual' весьма полезен, он не будет работать, если другой объект имеет дополнительное свойство, например, в случае OP. –

+0

Он также не работает, если порядок ключей не идентичен: / –

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)

Смежные вопросы