繁体   English   中英

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

[英]How can I check if two javascript objects have the same fields?

鉴于:

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

这些函数可能有更好的名称,但是应该这样做:

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

在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..
      }
   }
  }
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检查确保被比较的对象实际上是“对象”,而不是字符串。

尝试这个:

Object.keys(y).every(function (key) {
    return key in x;
});

使用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

你可以尝试这样的事情

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM