鉴于:
我在Javascript中有以下两个变量:
var x = {
dummy1: null
dummy2: null
};
// Return true
var y = {
dummy1: 99,
dummy2: 0
}
// Return false
var y = "";
// Return false
var y = {
dummy1: null
};
// Return false
var y = {
dummy1: null,
dummy2: null,
dummy3: 'z'
}
// Return false
var y = null;
// Return false
var y = ""
有人可以向我建议如何检查对象x
是否与y
具有相同的字段名称?请注意,我不检查参数的值。
答案 0 :(得分:4)
这些功能可能有更好的名称,但应该这样做:
function hasAllProperties(subItem, superItem) {
// Prevent error from using Object.keys() on non-object
var subObj = Object(subItem),
superObj = Object(superItem);
if (!(subItem && superItem)) { return false; }
return Object.keys(subObj).every(function (key) {
return key in superObj;
});
}
function allPropertiesShared(x, y) {
return hasAllProperties(x, y) &&
hasAllProperties(y, x);
}
答案 1 :(得分:3)
在javascript中,每个对象都包含元素作为数组。例如。
var bequal = true;
if(Object.keys(x).length !== Object.keys(y).length) {
bequal = false;
}
else {
for (var prop in x) {
if(!y.hasOwnProperty(prop)){
bequal = false;
break;
//both objects are not equal..
}
}
}
答案 2 :(得分:2)
function hasSameKeys(obj1, obj2) {
var toString = Object.prototype.toString;
if (toString.call(obj1).indexOf("Object") === -1
|| toString.call(obj2).indexOf("Object") === -1) {
return false;
}
var keys1 = Object.keys(obj1), keys2 = Object.keys(obj2);
return obj1.length === obj2.length &&
keys1.every(function(currentKey) {
return obj2.hasOwnProperty(currentKey);
});
}
console.assert(hasSameKeys({a:1, b:2}, {b:3, a:1}) === true);
console.assert(hasSameKeys({a:1, b:2}, "") === false);
console.assert(hasSameKeys({a:1, b:2}, {a:5}) === false);
toString
检查确保被比较的对象实际上是“对象”,而不是字符串。
答案 3 :(得分:0)
试试这个:
Object.keys(y).every(function (key) {
return key in x;
});
答案 4 :(得分:0)
以下是一个简单示例,说明其工作原理:
$ nodejs // should also work in Browser
> x = {a:1,b:2,c:3}
{ a: 1, b: 2, c: 3 }
> y = {a:3,b:1,c:4}
{ a: 3, b: 1, c: 4 }
> z={message:"Die Batman!"} // one of these things is not like the others
{ message: 'Die Batman!' }
> Object.keys(x)
[ 'a', 'b', 'c' ]
> Object.keys(y)
[ 'a', 'b', 'c' ]
> Object.keys(z)
[ 'message' ]
不要直接比较Object.keys,因为它们是数组,不会===
> Object.keys(x)===Object.keys(y)
false
此外,Object.keys()可能会在数组中提供不同的排序,从而导致不相等的数组,如['a','b','c']
vs ['b','a','c']
。修复此问题是添加Array.sort()
我建议使用JSON.stringify来创建密钥列表的字符串表示
> JSON.stringify(Object.keys(x).sort())===JSON.stringify(Object.keys(y).sort())
true
> JSON.stringify(Object.keys(x).sort())===JSON.stringify(Object.keys(z).sort())
false
答案 5 :(得分:0)
您可以尝试这样的事情
var isEqual = true;
for(var k in x)
{
if(x[k] != y[k])
isEqual = false;
}
for(var k in y)
{
if(x[k] != y[k])
isEqual = false;
}