10

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

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

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

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

  • 有没有更好/更简单的方法来用下划线做到这一点?
  • 没有下划线(首选)有没有更好/更简单的方法来做到这一点?
4

4 回答 4

10

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

function commonKeys(obj1, obj2) {
  var keys = [];
  for(var i in obj1) {
    if(i in obj2) {
      keys.push(i);
    }
  }
  return keys;
}
于 2013-06-03T00:46:56.957 回答
5

这适用于现代浏览器:

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

// ["firstName"]
commonKeys({ firstName: 'John' }, { firstName: 'Jane', lastName: 'Doe' });
于 2013-06-03T02:56:36.623 回答
2
var common = [];
for (var key in obj2) if (key in obj1) common.push(key);

为 RobG 编辑:如果您碰巧在包含不属于您自己的代码的环境中工作,并且您不相信作者已Object.prototype 正确扩展,那么您可能想要这样做:

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

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

于 2013-06-03T00:47:22.543 回答
0

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

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

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

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

这是我的格式中的原始问题以供参考

_.intersection(_.keys(user1), _.keys(user2))
于 2014-03-07T12:46:57.997 回答