2016-12-14 137 views
0

可以说有两个对象,但一个对象的属性与另一个不同。有没有办法找出哪些属性匹配?如何检查两个对象属性是否匹配?

例如

var objectOne = { 
    boy: "jack", 
    girl: "jill" 
} 


var objectTwo = { 
    boy: "john", 
    girl: "mary", 
    dog: "mo" 
} 

编辑:应该告诉我boygirl属性名在两个对象中找到。

+0

您的例子没有表现出很大的。你什么意思? – Li357

+1

所以你想要一个属性*名称*在两个对象中的列表,而不考虑它们的*值*是什么?我们应该假设没有物体嵌套? – nnnnnn

+0

@ nnnnnn。对,就是这样。 – Deke

回答

2
var in_both = []; 
for (var key in objectOne) { // simply iterate over the keys in the first object 
    if (Object.hasOwnProperty.call(objectTwo, key)) { // and check if the key is in the other object, too 
     in_both.push(key); 
    } 
} 

C.f.现在https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty

,如果你想测试,如果值是相同的,也不止代码内if的条件/身体根本补充。

+0

为什么不'objectTwo.hasOwnProperty(key)'? '.call()'如何提供帮助? (有趣的选择链接到*德文文档。) – nnnnnn

+0

@nnnnnn,'objectTwo'可以有自己的项目'hasOwnProperty'。不使用'.call'是一个简单的攻击媒介,尽管它不会造成比DOS更多的攻击。糟糕,没有注意到我连接了错误的语言。您可以简单地在下次编辑问题。 – kay

+0

够公平的。我想在我自己的代码中,我通常处理自己创建的对象,那里肯定不会有自己的'hasOwnProperty'。但是你的方式适用于任何对象。 – nnnnnn

1

您可以使用Object.keys,并通过使用一次Array.prototype.reduce循环,并列出了常见的按键 - 看演示如下:

var objectOne={boy:"jack",girl:"jill"}; 
 
var objectTwo={boy:"john",girl:"mary",dog:"mo"}; 
 

 
var result = Object.keys(objectOne).reduce(function(p,c){ 
 
    if(c in objectTwo) 
 
    p.push(c); 
 
    return p; 
 
},[]); 
 

 
console.log(result);

2

使用Object.keys

Object.keys(objectOne).filter(k => Object.hasOwnProperty.call(objectTwo, k)) 
+0

您的代码可以在线性时间内以二次方式解决问题。不要在生产中这样做! – kay

+0

这里是线性的:P – sbedulin

+1

您应该使用'hasOwnProperty',因为'null'和'undefined'可能是有效的值。 – kay

1

如果您想要找出哪些键匹配给定的两个对象,你可以遍历所有使用for... in循环的对象的键。在我的函数中,它将通过键循环并返回两个对象中所有匹配键的数组。

let objectOne = { 
 
    boy: "jack", 
 
    girl: "jill" 
 
} 
 

 
let objectTwo = { 
 
    boy: "john", 
 
    girl: "mary", 
 
    dog: "mo" 
 
} 
 

 
function matchingKeys (obj1, obj2) { 
 
    let matches = []; 
 
    let key1, key2; 
 
    
 
    for (key1 in obj1) { 
 
    for (key2 in obj2) { 
 
     if (key1 === key2) { 
 
     matches.push(key1); 
 
     } 
 
    } 
 
    } 
 
    return matches 
 
} 
 

 
const result = matchingKeys(objectOne, objectTwo); 
 
console.log(result)

+0

@Kay - 除了'var','let'和未声明以及因此全局变量的奇怪组合之外,我发现这很容易阅读。 – nnnnnn

+0

@Kay谢谢你的反馈,你是对的,它可以做到线性时间。我试图提高可读性,但我保持原有解决方案的精神。 –

+0

@nnnnn谢谢你的反馈,我使我的变量保持一致。你最好 –

0

试试这个关于大小:

function compare(obj1, obj2) { 
    // get the list of keys for the first object 
    var keys = Object.keys(obj1); 

    var result = []; 

    // check all from the keys in the first object 
    // if it exists in the second object, add it to the result 
    for (var i = 0; i < keys.length; i++) { 
     if (keys[i] in obj2) { 
      result.push([keys[i]]) 
     }   
    } 

    return result; 
} 
相关问题