我有两个对象文字,如下:
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用法是否是一个好例子?我自己还没有完成那么多函数式编程,但我有一种感觉,对于这个问题可能存在一个干净而聪明的解决方案.
没有的解决方案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) + '
');
给出的答案是好的,惊人但有可能是一个问题无效的答案,那就是:' 如果有什么属性值的一个故意设置为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)) + '
');