我有三个对象,object1:{a: 1, b: 2}
; object2:{a: 1, b: 3}
; object3:{a: 1, b: 2, c: 3}
,并希望将最后两个与第一个进行比较,并且只有在它们相等时才返回它们(如果它包含的值多于它包含的键等于彼此)。
所以,就像,我想要返回object3。
答案 0 :(得分:0)
你去了(但请修正你的问题)。这需要两个参数并返回它们是否可以统一(即它们共有的属性是否具有相同的值)。尽管如此,它只是做了一个浅薄的比较。让它进行深度比较递归是留给读者的练习;)
function unifiable(a, b){
for(var prop in a) if(a.hasOwnProperty(prop)
&& b.hasOwnProperty(prop) && a[prop] !== b[prop])
return false
return true // will happen if the loop ended without returning
}
答案 1 :(得分:0)
你可以使用这个功能
制作一个
的功能最终将第一个对象的属性与属性相匹配 第二个对象。
function copareobjectkeys(a,b)
{
for(var k in a)
{
if(a.hasOwnProperty(k) && b.hasOwnProperty(k) && b[k]!=a[k])
return false;
}
return true
}
现在拥有这三个对象
a ={a: 1, b: 2};
b= {a: 1, b: 3};
c= {a: 1, b: 2, c: 3}
将c与a和b与
进行比较copareobjectkeys(c,a) //true
copareobjectkeys(b,a) //false
答案 2 :(得分:0)
您可以使用a
检查b
中的每个密钥是否不在Array#all
或具有相同的值:
function unifiable(a, b) {
return Object.keys(a) . all(function(key) { return a[key] === b[key]; });
}
没有必要明确检查key
中是否存在b
,因为如果b
不包含key
,那么b[key]
将是未定义的,它不等于key
中a
的任何值。
以上内容会在key
的原型链中找到b
的值,因此如果这是一个问题,您需要对b.hasOwnProperty(key)
进行明确检查。
如果您希望NaN
被视为相同,则必须单独检查。
这将简单地检查这两个对象是否是可以统一的。要按照自己的意愿实际统一它们,一个简单的想法就是
unifiable(a, b) && Object.assign(a, b)
Object.assign
可以替换为$.extend
,_.extend
,Ember.merge
或您最喜欢的其他对象合并。