arrays - 如果两个数组的内容彼此不同,为什么这两个数组之间的比较不起作用?
问题描述
我尝试使用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;
感谢您的帮助 - 像往常一样!
解决方案
我从您的脚本中了解到, 和 的数组data
可能pushedDbData
是二维数组。在您的脚本中,比较data
和的数组时,会将 的pushedDbData
一个元素data
与 的所有元素进行比较pushedDbData
。此时,当 的元素data
与 的元素之一相同时pushedDbData
,duplicate
变为true
,即使所有其他元素都相同。我认为这可能是您的问题的原因。
为了检查数组的差异,以下两种模式怎么样?
模式一:
在此模式中, 和 的数组data
与pushedDbData
相同的索引进行比较。在这种情况下, 和 的每个元素都data
与pushedDbData
相同的索引进行比较。示例脚本如下。
var res = data.filter((r, i) => pushedDbData[i] && JSON.stringify(r.join()) != JSON.stringify(pushedDbData[i].join()));
console.log(res)
data
如果和的每个元素pushedDbData
不同且具有相同的索引,则 的长度res
大于1
。
模式二:
在此模式中, 和 的数组data
与pushedDbData
所有元素进行比较。在这种情况下,将 的每个元素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
不包含在 中时pushedDbData
,true
返回。即使只有一个元素不同,false
也会返回。
推荐阅读
- c# - 如何调整无边框 MDI 表单的大小?
- python - 快速且不占用内存的 k 最近邻搜索
- javascript - 如何从用户 discord.js v12 中删除所有角色?
- laravel - Laravel 8 - 路由找不到控制器:目标类 [Auth\LoginController] 不存在
- python - 获取表情符号#Python的情绪分数
- spring-boot - 当 spring-web 存在时,Spring Reactive WebSocket 不会出现
- reactjs - React Native Paper 文本输入更改颜色
- java - 使用 TreeMap 而不是属性
- c# - 如何获取给定字母数字范围内的所有值
- google-bigquery - Bigquery 中的表复制