afgphoenix
afgphoenix

Reputation: 79

if inside a "for in" loop

Checking for equality of two objects:

I am not sure about how my code flows and how can I fix this.

Inside areEqual function, I am checking "value" of two objects.

if they are equal -> isEqual=true -> for loop shall continue if one of values are not equal -> isEqual = false and Break from the loop.

But i don't get the desired results. What logic am i exactly not understanding here?

    function Address (street, city, zipCode) {
    this.street = street; 
    this.city = city; 
    this.zipCode = zipCode; 
}

let address1 = new Address('a', 'b', 'c'); 
let address2 = new Address('a', 'd', 'c'); 


//checking for equality between two objects
function areEqual(address1, address2){  
    let isEqual = true; 
        for(let key in address1) {
            if(address1[key] === address2[key])
                isEqual = true; 
            else
                isEqual = false
                break; 
        }
    if(isEqual) return 'They are equal'; 
        else return 'They are not equal'; 

}

console.log(areEqual(address1, address2)); 

Upvotes: 2

Views: 76

Answers (2)

adiga
adiga

Reputation: 35222

Your code is equivalent to:

if (address1[key] === address2[key])
  isEqual = true;
else 
  isEqual = false

break;

You need to wrap your else condition in {}. Currently it breaks out of the loop on the first iteration

function Address(street, city, zipCode) {
  this.street = street;
  this.city = city;
  this.zipCode = zipCode;
}

let address1 = new Address('a', 'b', 'c');
let address2 = new Address('a', 'd', 'c');

let address3 = new Address('x', 'y', 'z');
let address4 = new Address('x', 'y', 'z');

//checking for equality between two objects
function areEqual(address1, address2) {
  let isEqual = true;
  for (let key in address1) {
    if (address1[key] === address2[key])
      isEqual = true;
    else {
      isEqual = false
      break;
    }
  }
  if (isEqual) return 'They are equal';
  else return 'They are not equal';

}

console.log(areEqual(address1, address2));
console.log(areEqual(address3, address4));

You can avoid these type of errors if you format your code. Every code editor will have a shortcut for this functionality.

Note: Since you have constructor function for Address, this code will work. But note that, this just checks if the keys in address1 have the same value as address2. If you compare an empty object like this areEqual({}, address2) it will log They are equal because it never enters the for loop. So, you can add an additional check if Object.keys(address1).length is same as that of address2

Upvotes: 1

Dawid Wekwejt
Dawid Wekwejt

Reputation: 543

You have default value of isEquls: true, so if any of keys pair will be not equals than set isEquls to false and break the loop:

function Address (street, city, zipCode) {
    this.street = street; 
    this.city = city; 
    this.zipCode = zipCode; 
}

let address1 = new Address('a', 'd', 'd'); 
let address2 = new Address('a', 'd', 'c'); 


//checking for equality between two objects
function areEqual(address1, address2){  
    let isEqual = true; 
        for(let key in address1) {
            if(address1[key] !== address2[key])
            {
                isEqual = false
                break; 
            }
        }
    if(isEqual) return 'They are equal'; 
        else return 'They are not equal'; 

}

console.log(areEqual(address1, address2));

Upvotes: 0

Related Questions