skpdm
skpdm

Reputation: 1438

Find out if objects have same keys

I have a pair of objects. I'm trying to find out if they both have the same keys, like so:

let a = { user1: true, user2: true }
let b = { user1: true, user3: true }
hasSameKeys(a, b) => false

let a = { user1: true, user2: true }
let b = { user2: true, user1: true }
hasSameKeys(a, b) => true

I'm also using _underscore.js

Thanks in advance

John S.

Upvotes: 0

Views: 1886

Answers (3)

slider
slider

Reputation: 12990

Since you said you're using underscore, you can also use isEqual on sorted arrays of keys:

function hasSameKeys(a, b) {
  return _.isEqual(_.keys(a).sort(), _.keys(b).sort()); 
}

let a = { user1: true, user2: true };
let b = { user1: true, user3: true };
console.log(hasSameKeys(a, b));

a = { user1: true, user2: true };
b = { user2: true, user1: true };
console.log(hasSameKeys(a, b));
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore-min.js"></script>

Upvotes: 1

qiAlex
qiAlex

Reputation: 4346

Try this:

var a1 = { user1: true, user2: true }
var b1 = { user2: true, user1: true }
var c1 = { ...a1, ...b1}
var a1b1SameKeys = Object.keys(a1).length === Object.keys(b1).length && Object.keys(a1).length === Object.keys(c1).length
console.log (a1b1SameKeys) // true

var a2 = { user1: true, user2: true }
var b2 = { user1: true, user3: true }
var c2 = { ...a2, ...b2}
var a2b2SameKeys = Object.keys(a2).length === Object.keys(b2).length && Object.keys(a2).length === Object.keys(c2).length
console.log (a2b2SameKeys) // false


var a3 = { user1: true, user2: true, foo: true }
var b3 = { user1: true, user2: true, bar: false }
var c3 = { ...a3, ...b3}
var a2b2SameKeys = Object.keys(a3).length === Object.keys(b3).length && Object.keys(a3).length === Object.keys(c3).length
console.log (a2b2SameKeys) // false

Upvotes: 2

Mark
Mark

Reputation: 92440

You can test if they have the same number of keys and if every one of one object's keys are contained in the other:

function hasSameKeys(a, b){
    return Object.keys(a).length === Object.keys(b).length
    && Object.keys(a).every(k => b.hasOwnProperty(k))
}

let a = { user1: true, user2: true }
let b = { user1: true, user3: true }
console.log(hasSameKeys(a, b) )


a = { user1: true, user2: true }
b = { user2: true, user1: true }
console.log(hasSameKeys(a, b) )

Upvotes: 7

Related Questions