在Javascript对象中查找属性的交集

在Javascript对象中查找属性的交集,javascript,Javascript,大家好,假设我有以下两个对象 var obj1 = {one:232,two:3123,three:3232} var obj2 = {one:323,three:3444,seven:32} 我正在尝试编写一个函数,该函数将返回两个对象中的属性,假设我将始终有两个对象作为参数。因此,对于我的输出,看到[“一”,“三”]将是非常棒的 这是我写的 var extend = function(obj){ var x = Object.keys(arguments[0]); var

大家好,假设我有以下两个对象

var obj1 = {one:232,two:3123,three:3232}
var obj2 = {one:323,three:3444,seven:32}
我正在尝试编写一个函数,该函数将返回两个对象中的属性,假设我将始终有两个对象作为参数。因此,对于我的输出,看到
[“一”,“三”]
将是非常棒的

这是我写的

var extend = function(obj){ 
    var x = Object.keys(arguments[0]);
    var y = Object.keys(arguments[1]);
    var inter =[];
    for(var i = 0; i < x.length; i++){
        for(var k = 0; k < y.length;i++){
            if(x[i] === y[k]) {
                inter.push(y[k]);
            }

            }
        }
    return inter;   
}
var extend=function(obj){
var x=Object.keys(参数[0]);
var y=Object.keys(参数[1]);
var inter=[];
对于(变量i=0;i
我所期望的是创建两个对象的属性数组,并检查每对对象是否相等。如果是,我希望它将常用项推送到一个新数组中。由于某些原因,它无法运行,因为它似乎在无限期运行


有人能帮忙吗?

让自己轻松点-

返回一个数组,可以使用数组过滤器

var commonproperties= function(o1, o2){
    return Object.keys(o1).filter(function(itm){
        return itm in o2
    });
}

var obj1 = {one:232,two:3123,three:3232},
obj2 = {one:323,three:3444,seven:32};
commonproperties(obj1 ,obj2);

/*  returned value: (Array)
['one','three']
*/
开始

intersection(Object.keys(o1), Object.keys(o2))
现在您只需要编写交集,或者找到一个包含交集的库(请看下划线)

关键是,相交是集合或列表上的常规操作。与其编写与对象及其键的概念纠缠不清的交集逻辑,不如找到或编写一个执行一般交集操作的方法,然后简单地向其提供两个键列表。通过这种方式,您还可以更轻松地向交集逻辑中添加功能——例如,查找两个以上数组的交集

不过,为什么要麻烦呢?好的,一个很好的原因是,这种代码不太容易出现您遇到的bug类型,尝试编写一系列循环

如果您想编写自己的
交叉口
,您可能会比@kennebec的
过滤器
方法做得更糟:

function intersection(a1, a2) {
    return a1.filter(function(elt) { return a2.indexOf(elt) !== -1; });
}
通过这种方式分解交集逻辑的另一个优点是,您可以概括数组中“包含”的内容的规则。我们将标准函数作为第三个参数传入:

function intersection(a1, a2, contains) {
    return a1.filter(function(elt) { return contains(a2, elt); });
}
例如,我可以用它来无意识地检查关键交叉点情况:

intersection(Object.keys(o1), Object.keys(o2), contains_case_insensitive);
我们可以为
contains
参数添加默认值,以处理常见情况:

function intersection(a1, a2, contains) {
    contains = contains || function(a, e) { return a.indexOf(e) !== -1; };
    return a1.filter(function(elt) { return contains(a2, elt); });
}
使用fat arrow函数在ES6中编写此代码更为紧凑:

function intersection(a1, a2, contains) {
    contains = contains || (a, e) => a.indexOf(e) !== -1;
    var _contains = elt => contains(a2, elt);
    return a1.filter(_contains);
}

我自己做的,因为我找不到我需要的。单线交叉

x={x:1, y:2, z:1};
y={x:3, z:4, r:5};

intersect = Object.keys(x).filter(c => Object.keys(y).indexOf(c) !== -1).reduce((a,b) => {let b1={}; b1[b]=x[b]; return {...a, ...b1}}, {});
console.log(intersect);

for(var k=0;k
中,您增加
i
而不是
k
Gahh您找到了它。谢谢可能重复的