首页 > 解决方案 > 如果两个数组的内容彼此不同,为什么这两个数组之间的比较不起作用?

问题描述

我尝试使用JSON.stringify()来比较两个数组,我尝试在没有 的情况下比较它们JSON.stringify(),但似乎没有一种方法可以捕获其中一个数组元素的变化。请参阅下面突出显示的内容:

这是我正在运行的一段代码:

    var duplicate = false;
    loop1:
    for (var x = 0; x < data.length; x++) {
      loop2:
      for (var j = 0; j < pushedDbData.length; j++) {
        if (JSON.stringify(data[x].join()) == JSON.stringify(pushedDbData[j].join())) {
          duplicate = true;
          break loop1;
        }
      }
    }
    if (duplicate == true) {
      Browser.msgBox('No change has been been made.');
      return;

在此处输入图像描述

感谢您的帮助 - 像往常一样!

标签: arraysgoogle-apps-scriptgoogle-sheets

解决方案


我从您的脚本中了解到, 和 的数组data可能pushedDbData是二维数组。在您的脚本中,比较data和的数组时,会将 的pushedDbData一个元素data与 的所有元素进行比较pushedDbData。此时,当 的元素data与 的元素之一相同时pushedDbDataduplicate变为true,即使所有其他元素都相同。我认为这可能是您的问题的原因。

为了检查数组的差异,以下两种模式怎么样?

模式一:

在此模式中, 和 的数组datapushedDbData相同的索引进行比较。在这种情况下, 和 的每个元素都datapushedDbData相同的索引进行比较。示例脚本如下。

var res = data.filter((r, i) => pushedDbData[i] && JSON.stringify(r.join()) != JSON.stringify(pushedDbData[i].join()));
console.log(res)
  • data如果和的每个元素pushedDbData不同且具有相同的索引,则 的长度res大于1

模式二:

在此模式中, 和 的数组datapushedDbData所有元素进行比较。在这种情况下,将 的每个元素data与 的所有元素进行比较pushedDbData,并将相同元素和不同元素作为对象返回。

var obj = data.reduce((o, r, i) => {
  pushedDbData.forEach((s, j) => o[JSON.stringify(s.join()) == JSON.stringify(r.join()) ? "sameElement" : "differentElement"].push({indexOfData: i, indexOfPushedDbData: j}));
  return o;   
}, {sameElement: [], differentElement: []});
console.log(obj)
  • 在此示例脚本中,输出值作为每个数组的索引返回。

笔记:

  • but none of the way seems to capture the change in one of the array element.您的问题中,我提出了上述两种模式。当我误解了您的目标时,我可以问您您期望的示例输出吗?通过这个,我想修改它。

参考:

添加:

从您的示例电子表格和当前脚本中,以下修改如何?

var duplicate = false;
loop1:
for (var x = 0; x < data.length; x++) {
  loop2:
  for (var j = 0; j < pushedDbData.length; j++) {
    console.log(data[x])
    if (data[x].join() == pushedDbData[j].join()) {
      duplicate = true;
      break loop1;
    }
  }
}

至:

var obj = data.reduce((o, r) => Object.assign(o, {[JSON.stringify(r.join())]: true}), {});
var duplicate = pushedDbData.every(e => obj[JSON.stringify(e.join())]);
  • 在这个修改后的脚本中,首先创建了一个对象,用于从data中搜索值pushedDbData。并且,当 的值data不包含在 中时pushedDbDatatrue返回。即使只有一个元素不同,false也会返回。

推荐阅读