2016-08-25 3 views
-1

В моем угловом приложении у меня есть 2 объекта, которые я хочу сравнить. Для этого я использую угловые. Равенства (obj1, obj2). Как бы то ни было, некоторые атрибуты, которые не имеют значения для моего сравнения, и угловые .equals() вернут false.Сравнение объектов при игнорировании некоторых атрибутов

Каков наилучший и самый короткий способ сделать сравнение в угловом, игнорируя некоторые атрибуты? Так, например, obj1.name может быть «John», а obj2.name может быть «Tom», и я все равно вернусь, когда все остальные атрибуты будут одинаковыми?

+0

Существует аналогичный вопрос по этой ссылке посмотреть, если это помогает http://stackoverflow.com/questions/1068834/object -comparison-in-javascript –

ответ

1

Если есть набор конкретных ключей, которые вы хотите сравнить, вы можете просто пропустить их и проверить, совпадают ли они. Здесь я чувствую себя великодушным.

function compareProperties(obj1, obj2, properties) { 
    for(var i=0; i<properties.length; ++i) { 
    var key = properties[i]; 
    if(obj1[key] !== obj2[key]) { 
     return false; 
    } 
    } 
    return true; 
} 

var dude = { 
    surname: 'Smith', 
    name: 'John', 
    nickname: 'Dude' 
} 

var bro = { 
    surname: 'Smith', 
    name: 'John', 
    nickname: 'Bro' 
} 

compareProperties(dude, bro, ['name','surname']); // returns true 
compareProperties(dude, bro, ['name','nickname']); // returns false 
+0

Сегодня я узнал, что «фамилия» на английском языке эквивалентна «фамилии» на французском языке, а французский «surnom» - это «ник» на английском языке. Хорошо знать. –

1

Вот решение, если вы только знаете, какие атрибуты вам нужно пропустить

var match = true; 
var skipAttr = ['attr1', 'attr2', ..., 'attrn']; 
var objs = [obj1, obj2]; 

matchFailed: 
for(var i = 0; i < 2; i++) { 

    next: 
    for(var k in objs[i]) { 

    for(var v in skipAttr) { 
     if(k == v) 
     break next; 
    } 

    if(!(k in objs[(i+1)%2]) || (i == 0 && !angular.equals(obj1[k],obj2[k]))) { 
     match = false; 
     break matchFailed; 
    } 
    } 
} 

console.log(match); 
+0

Я никогда не видел, чтобы кто-либо активно использовал помеченные перерывы в циклах JS раньше. Я чувствую себя любопытным ребенком, который тыкает что-то палкой. –

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