1

Использование underscore.js Я пытаюсь сравнить два объекта друг с другом, и если они такие же, я хочу вернуть true. Для этого я использую _.isEqual().Сравнение двух объектов с неопределенными значениями с использованием underscore.js

var a = {0: "2", 1: "11", 2: "1"} 
var b = {0: "2", 1: "11", 2: "1"} 
_.isEqual(a, b) // returns true 

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

var a = {0: "2", 1: undefined, 2: undefined} 
var b = {0: "2", 1: "11", 2: "1"} 
_.isEqual(a, b) // returns false 

Я хотел бы способ (очевидно, не используя ._isEqual) для этого, чтобы вернуть истинную, если некоторые из значений сравниваемых не определены. Есть идеи?

+0

Итак '_.isAlmostEqual()'? Если вы имеете дело только с простыми, не вложенными объектами, такими как показанные, вы можете написать свою собственную функцию сравнения только с четырьмя строками кода. Если вы хотите разрешить вложенные объекты, я уверен, что вы могли бы взять одно из существующих решений (включая Underscore) и изменить его, чтобы игнорировать неопределенные свойства. – nnnnnn

+0

Я не думаю, что это метод подчеркивания ... haha ​​ –

ответ

2

Вот одно решение, которое первым работает, какие общие ключи определены значения, а затем использует _.isEqual сделать сравнение:

var a = {0: "2", 1: undefined, 2: undefined} 
var b = {0: "2", 1: "11", 2: "1"} 

// helper predicate that returns true if the value passed to it is undefined 
var notUndefined = _.negate(_.isUndefined); 

// find the common keys that have defined values 
var keys = _.intersection(_.keys(_.pick(a,notUndefined)), _.keys(_.pick(b,notUndefined))) 

// compare only the common keys 
var result = _.isEqual(_.pick(a, keys), _.pick(b, keys)); 

NB Это будет работать, только если объекты содержат примитивные типы (без вложенных объектов или массивов)

+0

Это работает! Большое спасибо за помощь! –