1

I am looking to compare keys in two objects. Is there a built-in method to do this or a shorter version of something like the following?

// treat keys as enumerableOwn
// 1. Difference: {}.keys() - {}.keys()
Object.prototype.diff = function(obj2) {
    let thisKeys = Object.keys(this);
    let arr = [];
    for (let i=0; i < thisKeys.length; i++) {
        let key = thisKeys[i];
        if (!(obj2.hasOwnProperty(key))) {
            arr.push(key);
        }
    }
    return arr;
}
// 2. Intersection: {}.keys() && {}.keys()
Object.prototype.same = function(obj2) {
    let thisKeys = Object.keys(this);
    let arr = [];
    for (let i=0; i < thisKeys.length; i++) {
        let key = thisKeys[i];
        if (obj2.hasOwnProperty(key)) {
            arr.push(key);
        }
    }
    return arr;
}
// 3. Union: {}.keys() || {}.keys()
Object.prototype.union = function(obj2) {
    let arr = Object.keys(this);
    for (let key of Object.keys(obj2)) {
        if (!(obj1.hasOwnProperty(key))) {
            arr.push(key);
        }
    }
    return arr;
}


let obj1 = {x: 1, y: 2};
let obj2 = {x: 3, z: 4}
console.log(obj1.diff(obj2));
console.log(obj1.same(obj2));
console.log(obj1.union(obj2));

6
  • 1
    First of all, don't put methods on Object.prototype like that or even at all! Commented Mar 18, 2022 at 17:39
  • Related: stackoverflow.com/a/35047888/271415 Commented Mar 18, 2022 at 17:39
  • array filter(). Commented Mar 18, 2022 at 17:39
  • Since you're diffing/intersecting/combining only lists of strings, not the objects themselves, you probably should not make these methods of Object. And for array intersection etc, yes there are shorter ways to do it Commented Mar 18, 2022 at 17:42
  • @Bergi so instead should it use normal functions or make a class that inherits the Object type? Commented Mar 18, 2022 at 17:54

1 Answer 1

1

A slightly different and shorter way to do it would be as follows:

function diff(obj1, obj2) {
    let keys = Object.keys(obj2);
    return Object.keys(obj1).filter((elem) => !keys.includes(elem))
};
function same(obj1, obj2) {
    let keys = Object.keys(obj2);
    return Object.keys(obj1).filter((elem) => keys.includes(elem));
}
function union(obj1, obj2) {
    let keys = [...Object.keys(obj1), ...Object.keys(obj2)];
    return Array.from(new Set(keys));
}

let obj1 = {x: 1, y: 2};
let obj2 = {x: 3, z: 4}
console.log(diff(obj1, obj2));
console.log(same(obj1, obj2));
console.log(union(obj1, obj2));

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.