JavaScript: сравнение объектов как структур данных - PullRequest
0 голосов
/ 16 марта 2011

Мне нужно выполнить такие операции, как сравнение, чтобы два числовых массива имели одинаковые значения или два объекта имели одинаковые значения членов. Есть ли метод, который делает это для меня уже (или ECMAScript или jQuery)?

Например, функция должна возвращать true, чтобы они оба были одинаковыми:

var a = [1,2,3,4];
var b = [1,2,3,4];

Или с объектами, функция должна вернуть, что эти два одинаковы:

var a = { id: 99, name: "Chris" };
var b = { name: "Chris", id: 99 };

Я думаю, может быть, просто JSON.stringify(a) === JSON.stringify(b)? Любая проблема с этим?

Ответы [ 3 ]

1 голос
/ 16 марта 2011

Попробуйте библиотеку эквивалент от Филиппа Рате.(К сожалению, основной сайт, кажется, не работает, поэтому я связался с источником js-test-driver.)

0 голосов
/ 16 марта 2011

Вот довольно глупый способ сравнить два объекта, содержащие скалярные значения:

function same(object1, object2) {
    var merged = $.extend({}, object1, object2);
    for (var key in merged) {
        if (!object1.hasOwnProperty(key) || 
            !object2.hasOwnProperty(key) || 
             object1[key] != merged[key]) {
            return false;
        }
    }
    return true;
}

Он опирается на extend в jQuery и завершается ошибкой, если object2 наследует свойства от прототипа, поскольку extend копирует ихтоже.

0 голосов
/ 16 марта 2011
function areEquiv ( a, b ) {
  var eqCount = 0,
      sizeCount = 0,
      othCount = 0,
      i;

  if (typeof a.concat === "function") { // if comparing arrays
    for (i = 0; i < a.length; i++) {
      othCount = sizeCount = sizeCount + 1;
      if (a[i] === b[i]) eqCount++;
    }
  } else {                              // if comparing objects
    for (i in a) {
      if (a.hasOwnProperty(i)) {
        sizeCount = sizeCount + 1;
        if (a[i] === b[i]) eqCount++;
      }
    }
    for (i in b) {
      if (b.hasOwnProperty(i)) {
        othCount = othCount + 1;
      }
    }
  }

  return (a.length == b.length && eqCount == sizeCount && sizeCount == othCount);
}

Обратите внимание, что это будет работать только до тех пор, пока массив или объект содержат простые значения и не являются массивом объектов или объекта с параметром, который также является объектом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...