我有两个对象常量,如下所示:
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使用的一个好例子?我自己没有做过那么多函数式编程,但是我有一种感觉,对于这个问题可能存在一个干净而聪明的解决方案。
6条答案
按热度按时间dgtucam11#
没有
indexOf
的解决方案。时间复杂度O(n)
f0ofjuux2#
给出的答案很好,令人惊讶,但可能有一个问题,在void的answer,这是:"* 如果其中一个属性值有意设置为
undefined
,该怎么办。*"Nina的answer很好(真的很棒),但由于我们处于有趣JavaScript的时代,我认为我的不会太差:
更新
onalbi在注解中提到了一些性能问题,这是合理的,因此下面的代码似乎是处理该问题的更好方法:
niknxzdl3#
我建议的程序是:
1.对于其中一个对象,使用
Object.keys()
获取键的array
。1.使用
.filter
查找数组的交集,并检查第二个对象是否包含与第一个数组匹配的键。lnxxn5zx4#
递归函数
这是另一个解决方案,可能对你有帮助。我用了一个递归函数来截取两个对象。这个解决方案的优点是你不需要担心属性同时是对象。
在这种情况下,函数拦截两个对象中存在的属性,并分配“objSource”的值,就像拦截的属性的最终值一样。
yr9zkbsy5#
下面是一个简单的条目,功能非常强大,可以处理任意数量的对象,并从传递的第一个对象返回匹配键的值。
这个行为类似于PHP中的array_intersect_key(),以防有人搜索它。
在此扩展以获得更好的解释和注解
需要注意的是,这个解决方案只适用于字符串键,Symbol键将被忽略,最终的对象将不包含任何键。尽管可以编写一个类似的函数来比较Symbol的交集。
rqmkfv5c6#
我知道这是一个老职位,但是,我想分享一个解决方案,我今天写的,我相信是高效和干净。
该函数可以接收n个对象,并找到相交键。
这就是它的工作原理。
1.Map对象,创建键数组的数组。
1.按长度对数组排序,这将把最小的键数组放在第一位。
1.最后,通过根据下一个键列表过滤每个键列表来减少键数组。
我认为这个算法的聪明之处在于对键数组的预排序。通过从最小的键列表开始,我们比较键的工作就少了。
以下是常用语: