找到两个Javascript对象的公共成员

时间:2013-06-03 00:43:01

标签: javascript underscore.js

在两个Javascript对象中查找公共成员的最简单方法是什么? 这个问题不是关于平等。我不关心每个成员的价值,只是它们存在于两个对象中。

这是我到目前为止所做的事情(使用underscore.js):

_.intersection(_.keys({ firstName: 'John' }), _.keys({ firstName: 'Jane', lastName: 'Doe' }))

这给了我['firstName']的预期结果,但我希望找到一种更简单或更有效的方式,最好是vanilla Javascript。

  • 使用下划线有更好/更简单的方法吗?
  • 有没有更好/更简单的方法没有下划线(首选)?

4 个答案:

答案 0 :(得分:10)

当然,只需遍历一个对象的键并构造另一个对象共享的键数组:

function commonKeys(obj1, obj2) {
  var keys = [];
  for(var i in obj1) {
    if(i in obj2) {
      keys.push(i);
    }
  }
  return keys;
}

答案 1 :(得分:4)

这适用于现代浏览器:

function commonKeys(a, b) {
    return Object.keys(a).filter(function (key) { 
        return b.hasOwnProperty(key); 
    });
};

// ["firstName"]
commonKeys({ firstName: 'John' }, { firstName: 'Jane', lastName: 'Doe' });

答案 2 :(得分:2)

var common = [];
for (var key in obj2) if (key in obj1) common.push(key);

编辑RobG :如果您恰好在包含非您自己的代码的环境中工作,,则您不相信作者已延长Object.prototype correctly,然后可能想要这样做:

var common = [];
for (var k in obj2) if (obj2.hasOwnProperty(k) && obj1.hasOwnProperty(k)) common.push(k);

然而,正如我在下面的评论中所述,我写了一篇文章(带有煽动性的标题),说明为什么我认为这曾经是好建议,但不再是好建议:
http://phrogz.net/death-to-hasownproperty

答案 3 :(得分:0)

我知道这个问题已经得到解答,但我想提供一种“强调”的方式。我也希望人们也会在这里讨论最好的“下划线”方式。

var user1 = { firstName: 'John' }, user2 = { firstName: 'Jane', lastName: 'Doe' };

_.keys(_.pick(user1, _.keys(user2)))

这是我最好的镜头,它不会从原始问题中减少下划线原语,所以也许这是你能做的最好的。

以下是我的参考格式的原始问题

_.intersection(_.keys(user1), _.keys(user2))
相关问题