2015-12-19 2 views
1

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

var personA = 
    { 
     name: "Josh Kloss", 
     age: 33 
    } 
var personmB = 
{ 
    name: 'Josh Kloss', 
    age: 43 
} 

function compareTwoPeople(a, b) { 

    var person1 = Object.keys(a); 
    var person2 = Object.keys(b); 
    if (person1.length !== person2.length) { 
     console.log("They are not same"); 
    } 
    else { 
     for (var i = 0; i < person1.length; i++) { 
      if (person1[i] === person2[i]) { 
       console.log("They are same"); 
      } 
     } 
    } 

} 

compareTwoPeople(personA, personmB); 

Как я могу сравнить эти два объекта ... Спасибо.

ответ

0

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

var personA = 
    { 
     name: "Josh Kloss", 
     age: 33 
    }; 
var personB = 
{ 
    name: 'Josh Kloss', 
    age: 43 
}; 

function compare(a, b) { 
    var aKeys = Object.keys(a), 
     bKeys = Object.keys(b); 

    if(aKeys.length != bKeys.length) return false; 

    for(var i = 0; i < aKeys.length; i++) { 
    if(a[aKeys[i]] != b[bKeys[i]]) return false; 
    } 

    return true; 

} 

compare(personA, personB); 
0

Вы ищете person1[i], который будет [ 'name', 'age' ][0], то есть 'name', имя ключа. То же самое для обоих объектов. Быстрое решение на ваш вопрос:

if (a[person1[i]] !== b[person2[i]]) { 
    console.log("They are not the same"); 
    return; 
} 

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

+0

Я думаю, что если ключ порядок не имеет значения, используя «а [person1 [i]]! == b [person1 [i]] "было бы лучше – Surely

+0

@ Andy вы можете дать мне полный код. Я новичок здесь. –

-1

вы можете сравнить, пройдя через каждые свойства,

var personA = 
    { 
     name: "Josh Kloss", 
     age: 33 
    }; 

var personB = 
{ 
    name: 'Josh Kloss', 
    age: 43 
}; 

function getObjectSize(obj){ 
    var size = 0, key; 
    for (key in obj) { 
     if (obj.hasOwnProperty(key)) size++; 
    } 
    return size; 
} 

function isObjectsEqual(a, b){ 

    //check objects has equal length 
    if(getObjectSize(a) !== getObjectSize(b)){ 
     return false; 
    } 

    //check properties are equal 
    for (var key in a) { 

     if (b.hasOwnProperty(key)){ 

      if(a[key] != b[key]){ 
       return false; 
      } 
     } 
     else{ 
      return false; 
     } 
    } 

    return true; 
} 

isObjectsEqual(personA, personB); //test function 
0

Вы могли бы рассмотреть возможность использования Array.prototype.every для сравнения части стоимости имущества. Это эффективно, как она возвращает ложь при первом рассогласования, а не идти по всем свойствам, когда он не должен:

var personA = {name: "Josh Kloss", age: 33}; 
 
var personB = {name: 'Josh Kloss', age: 43}; 
 

 
// Return true if objects a and b have the same properties 
 
// with the same values. Otherwise, false. 
 
function compareTwoPeople(a, b) { 
 

 
    var person1 = Object.keys(a); 
 
    var person2 = Object.keys(b); 
 

 
    // Use first test to initialise result 
 
    var result = person1.length === person2.length; 
 

 
    // If passed the first test, do the second 
 
    if (result) { 
 

 
    // Use every to test each value, returns false at first mismatch 
 
    result = person1.every(function(prop){ 
 
     return a[prop] === b[prop]; 
 
    }); 
 
    } 
 
    return result; 
 
} 
 

 
document.write('Are they the same? ' + compareTwoPeople(personA, personB));

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