Search code examples
javascriptobjectfunctional-programmingbig-ointersection

Best way to get intersection of keys of two objects?


I have two object literals like so:

var firstObject =
{
    x: 0,
    y: 1,
    z: 2,

    a: 10,
    b: 20,
    e: 30
}

var secondObject =
{
    x: 0,
    y: 1,
    z: 2,

    a: 10,
    c: 20,
    d: 30
}

I want to get the intersection of the keys these two object literals have like so:

var intersectionKeys  = ['x', 'y', 'z', 'a']

I can obviously do a loop and see if a key with the same name exists in the other object, but I am wondering if this would be a good case for some functional programming and map / filter / reduce usage? I myself have not done that much functional programming, but I have a feeling, that there could exist a clean and clever solution for this problem.


Solution

  • A solution without indexOf.

    var firstObject = { x: 0, y: 1, z: 2, a: 10, b: 20, e: 30 },
        secondObject = { x: 0, y: 1, z: 2, a: 10, c: 20, d: 30 };
    
    function intersection(o1, o2) {
        return Object.keys(o1).concat(Object.keys(o2)).sort().reduce(function (r, a, i, aa) {
            if (i && aa[i - 1] === a) {
                r.push(a);
            }
            return r;
        }, []);
    }
    
    document.write('<pre>' + JSON.stringify(intersection(firstObject, secondObject), 0, 4) + '</pre>');

    Second attempt with O(n).

    var firstObject = { x: 0, y: 1, z: 2, a: 10, b: 20, e: 30 },
        secondObject = { x: 0, y: 1, z: 2, a: 10, c: 20, d: 30 };
    
    function intersection(o1, o2) {
        return Object.keys(o1).filter({}.hasOwnProperty.bind(o2));
    }
    
    document.write('<pre>' + JSON.stringify(intersection(firstObject, secondObject), 0, 4) + '</pre>');