📌  相关文章
📜  比较javascript中的两个对象数组返回差异 - Javascript(1)

📅  最后修改于: 2023-12-03 15:11:01.045000             🧑  作者: Mango

比较 JavaScript 中的两个对象数组返回差异

有时候我们需要比较两个 JavaScript 中的对象数组,找出它们之间的差异。这个过程可以在我们开发中的各种情况中使用,例如验证用户提交的表单数据是否有效或者比较数据库中的数据版本。

方案

在双方相互比较之前,我们需要确定两个数组之间的相同点和不同点。我们可以实现这个目的的一种方法是遍历两个数组,分别寻找它们之间的差异,然后将差异存储到新的数组中。

function compareArrays(array1, array2) {
  var diff = [];
  for (var i = 0; i < array1.length; i++) {
    var item1 = array1[i];
    var found = false;
    for (var j = 0; j < array2.length; j++) {
      var item2 = array2[j];
      if (isEqual(item1, item2)) {
        found = true;
        break;
      }
    }
    if (!found) {
      diff.push(item1);
    }
  }
  return diff;
}

function isEqual(item1, item2) {
  // ...
  // 请实现你的比较方法,用于判断两个对象是否相等
  // ...
}

在上面的代码中,我们通过遍历两个数组并使用 isEqual 方法来比较它们之间的差异。如果我们找不到数组1中的当前项目,则将其添加到diff数组中并返回该数组。

比较对象

为了比较两个对象是否相等,我们必须比较它们的属性。这个过程需要递归执行以处理嵌套的对象。在比较对象时,我们可以使用以下方法:

function isEqual(item1, item2) {
  var props1 = Object.getOwnPropertyNames(item1);
  var props2 = Object.getOwnPropertyNames(item2);
  if (props1.length != props2.length) {
    return false;
  }
  for (var i = 0; i < props1.length; i++) {
    var propName = props1[i];
    var propValue1 = item1[propName];
    var propValue2 = item2[propName];
    if (typeof(propValue1) === "object") {
      if (!isEqual(propValue1, propValue2)) {
        return false;
      }
    } else if (propValue1 !== propValue2) {
      return false;
    }
  }
  return true;
}

在上面的代码中,我们检查每个对象的属性是否相等。如果属性包含嵌套对象,则递归搜索该对象。如果其中一个对象不包含另一个对象的属性,则函数将返回false,否则它将返回true。

示例

接下来的示例演示了如何比较两个对象数组并找出它们之间的差异。

var array1 = [
  { id: 1, name: 'John' },
  { id: 2, name: 'Bob' },
  { id: 3, name: 'Sarah' },
];

var array2 = [
  { id: 2, name: 'Bob' },
  { id: 3, name: 'Sara' },
  { id: 4, name: 'Jane' },
];

var diff = compareArrays(array1, array2);

console.log(diff);

在这个例子中,我们比较了两个对象数组。数组1包含了3个对象,而数组2包含了3个不同的对象。数组2中的第二个对象的名称中少了一个'h',基于这个差异,diff数组仅包含了数组1中的第一个对象。

输出结果为:

[
  { id: 1, name: 'John' }
]
总结

通过比较两个对象数组,我们可以找出它们之间的差异。我们可以使用遍历和递归搜索对象属性来实现这个过程。在比较对象时,我们需要考虑对象嵌套的情况,并注意处理属性少或多的情况。