我有两个字符串数组,如下所示。我想比较两个并获取已更改的行。我目前正在使用lodash来查找差异,但是对于大型数据集(50K行,10列)失败了。我想知道是否有任何有效的算法可以实现,而不是lodash可能使用的强力方法。
var array1 = [
"[1,data,data,data,data]",
"[2,data,data,data,data]",
"[3,data,data,data,data]",
"[4,data,data,data,data]",
];
var array2 = [
"[1,data,data,data,data]",
"[2,data,data2,data,data]",
"[3,data,data,data2,data]",
"[4,data,data,data,data]",
];
我希望该方法返回第2行和第3行,因为数据已更改为data2。
提前感谢您的帮助。
更多信息: - 字符串中的每个元素都是一列。我忘了提到行代表数据库中的数据,第一个元素是主键。我的用户正在Excel中加载此数据,然后对其进行修改,例如更新数据,插入新行或删除行。我希望能够找出插入,删除或更新的行,以便我只需要更新数据库中的行。目前,我不得不删除数据库中的所有内容并重新插入整个数据集,这显然不是最好的方法。我已经能够使用具有20K行的lodash(每行包含10个元素)来执行此操作,但是lodash无法处理比此更大的数据集。所以我想知道是否有更好的方法来做到这一点。这是我的lodash代码
insertedOrUpdatedRows = _.differenceWith(modifiedData, originalData, _.isEqual);
deletedRows = _.differenceWith(originalData, modifiedData, compareFunction);
function compareFunction(a, b) {
if(a[0] == b[0]) {
return true;
}
else
return false;
}
答案 0 :(得分:2)
假设您的数据已排序,则会在O(n)
中进行排序,此外,如果未对其进行排序,您只需对其进行排序即可O(nlogn)
。与.filter
方法不同,这也考虑了两个数组的长度是否发生了变化,这意味着添加或删除了一个元素。
var array1 = [
'[1,data,data,data,data]',
'[2,data,data,data,data]',
'[3,data,data,data,data]',
'[4,data,data,data,data]',
];
var array2 = [
'[1,data,data,data,data]',
'[2,data,data2,data,data]',
'[3,data,data,data2,data]',
'[4,data,data,data,data]',
];
function diff(a1, a2) {
let p1 = 0;
let p2 = 0;
const diff = [];
for (;;) {
if (p1 === a1.length && p2 === a2.length) break;
if (p1 === a1.length) {
diff.push(a2[p2++]);
continue;
}
if (p2 === a2.length) {
diff.push(a1[p1++]);
continue;
}
const e1 = a1[p1];
const e2 = a2[p2];
if (e1 > e2) {
p2++;
diff.push(e2);
} else if (e1 < e2) {
p1++;
} else {
p1++;
p2++;
}
}
return diff;
}
console.log(diff(array1, array2))
&#13;