简体   繁体   中英

How to compare two objects but skip values and just compare keys and key types?

I want to write unit testing using Jest for my Node.js functions and need to test if response object has some specific keys or not. Something like this:

expect(await mokChannelsService.getChannel(inputDto)).toEqualKeys(outputDto);

// Or just a normal function

const result = await mokChannelsService.getChannel(inputDto);
const equal = isEqualKeys(result, outputDto);

This toEqualKeys function should check equality just for keys not values. And these objects are not instances of a class. for example these two objects should be equal:

const object1 = {
  names: {
    firstName: '',
    lastName: '',
  },
  phone: 1,
};

const object2 = {
  names: {
    firstName: 'John',
    lastName: 'Due',
  },
  phone: 1234567890,
};

const object3 = {
  names: {
    firstName: 'John',
    lastName: 12,
  },
  mobile: '12345',
};

const result1 = toEqualKeys(object1, object2); // true
const result1 = toEqualKeys(object1, object3); // false

Is there any NPM packages available for this?

You can iterate each of the keys in object1 , checking that the same key exists in object2 and - if the associated property in object1 is an object, that all the keys from that object also exist in a similar object in object2 :

 const object1 = { names: { firstName: '', lastName: '', }, phone: 1, }; const object2 = { names: { firstName: 'John', lastName: 'Due', }, phone: 1234567890, }; const object3 = { names: { firstName: 'John', lastName: 12, }, mobile: '12345', }; const toEqualKeys = (obj1, obj2) => Object.keys(obj1).every(k => k in obj2 && (typeof obj1[k],= 'object' || typeof obj2[k] == 'object' && toEqualKeys(obj1[k]. obj2[k])) ) console,log(toEqualKeys(object1. object2)) console,log(toEqualKeys(object1, object3))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM