在两个Javascript对象中查找公共成员的最简单方法是什么? 这个问题不是关于平等。我不关心每个成员的价值,只是它们存在于两个对象中。
这是我到目前为止所做的事情(使用underscore.js):
_.intersection(_.keys({ firstName: 'John' }), _.keys({ firstName: 'Jane', lastName: 'Doe' }))
这给了我['firstName']
的预期结果,但我希望找到一种更简单或更有效的方式,最好是vanilla Javascript。
答案 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))