如何检查两个javascript对象是否具有相同的字段?

时间:2014-06-04 08:36:56

标签: javascript

鉴于:

我在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具有相同的字段名称?请注意,我检查参数的值。

6 个答案:

答案 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)

使用Object.keys()

以下是一个简单示例,说明其工作原理:

$ 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;
}