Как я могу проверить, имеют ли два объекта 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 2

6 ответов:

Есть, вероятно, лучшие имена для этих функций, но это должно сделать это:

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

Вы можете попробовать что-то вроде этого

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

Использование 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(x)===Object.keys(y)
false

Также, Объект.ключи () могут давать различное упорядочение в массиве, приводя к неравным массивам, таким как ['a','b','c'] vs ['b','a','c']. Исправить это можно, добавив Array.sort()

Я предлагаю использовать JSON.преобразовать в строки, чтобы создать строковое представление ключа списков

> 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