当前位置:  开发笔记 > 编程语言 > 正文

获得两个对象的交叉点的最佳方法是什么?

如何解决《获得两个对象的交叉点的最佳方法是什么?》经验,为你挑选了2个好方法。

我有两个对象文字,如下:

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
}

我想获得这两个对象文字的键的交集:

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

我显然可以做一个循环,看看另一个对象中是否存在具有相同名称的键,但我想知道这对于某些函数式编程和map/filter/reduce用法是否是一个好例子?我自己还没有完成那么多函数式编程,但我有一种感觉,对于这个问题可能存在一个干净而聪明的解决方案.



1> Nina Scholz..:

没有的解决方案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('
' + JSON.stringify(intersection(firstObject, secondObject), 0, 4) + '
');


2> Morteza Tour..:

给出的答案是好的,惊人但有可能是一个问题无效的答案,那就是:' 如果有什么属性值的一个故意设置为undefined.

尼娜的答案很好(非常棒)但是因为我们处于明天的JavaScript边缘,我认为我的情况不会太糟糕:

var a = { x: undefined, y: 1, z: 2, a: 10, b: 20, e: 30 }
var b = { x: 0, y: 1, z: 2, a: 10, c: 20, d: 30 }

function intersect(o1, o2){
    return Object.keys(o1).filter(k => k in o2)
}

document.write('
' + JSON.stringify(intersect(a, b)) + '
');
推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有