Javascript 比较两个大型字符串数组以找出差异?有什么有效的算法吗?
我有两个字符串数组,如下所示。我想比较这两个行,并返回已更改的行。我目前正在使用lodash查找差异,但是对于一个大型数据集(50K行,10列),它失败了。我想知道是否有什么有效的算法可以替代洛达斯可能使用的暴力方法Javascript 比较两个大型字符串数组以找出差异?有什么有效的算法吗?,javascript,algorithm,set,lodash,Javascript,Algorithm,Set,Lodash,我有两个字符串数组,如下所示。我想比较这两个行,并返回已更改的行。我目前正在使用lodash查找差异,但是对于一个大型数据集(50K行,10列),它失败了。我想知道是否有什么有效的算法可以替代洛达斯可能使用的暴力方法 var array1 = [ "[1,data,data,data,data]", "[2,data,data,data,data]", "[3,data,data,data,data]", "[4,data,data,data,data]", ]; var array2 = [
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行,因为数据已更改为数据2
提前感谢您的帮助
更多信息:
-字符串中的每个元素都是一列。我忘了提到行表示来自数据库的数据,第一个元素是主键。我的用户正在Excel中加载此数据,然后对其执行修改,例如更新数据、插入新行或删除行。我希望能够找出哪些行已被插入、删除或更新,以便只需更新数据库中的行。目前,我必须删除数据库中的所有内容并重新插入整个数据集,这显然不是最好的方法。我已经能够使用lodash处理20K行(每行包含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;
}
假设您的数据已排序,这将在
O(n)
中执行,而且,如果未排序,您可以对其进行排序,它将是O(nlogn)
。与.filter
方法不同,该方法还考虑了两个数组的长度是否已更改,即是否添加或删除了元素
var数组1=[
“[1,数据,数据,数据,数据]”,
[2,数据,数据,数据,数据],
[3,数据,数据,数据,数据],
[4,数据,数据,数据,数据],
];
变量array2=[
“[1,数据,数据,数据,数据]”,
“[2,数据,数据2,数据,数据]”,
[3,数据,数据,数据2,数据],
[4,数据,数据,数据,数据],
];
功能差异(a1,a2){
设p1=0;
设p2=0;
常数差=[];
对于(;;){
如果(p1==a1.长度和p2==a2.长度)中断;
如果(p1==a1.长度){
差分推送(a2[p2++]);
继续;
}
如果(p2==a2.长度){
压差(a1[p1++]);
继续;
}
常数e1=a1[p1];
常数e2=a2[p2];
如果(e1>e2){
p2++;
差异推力(e2);
}else if(e1 console.log(diff(array1,array2))
“任何有效的算法?”您尝试过的过程的当前基准是什么?在问题的上下文中,“列”是什么意思?如果元素之间始终存在1:1的关系,并且数据始终是字符串或数字,您应该能够使用筛选器并比较字符串化数组:a.filter((v,i)=>v==b[i])
。但是您没有提供足够的信息来知道这是否可行。如果我们可以假设数组也将保持相同的顺序和计数,那么您的lodash
函数看起来是什么样子的,因为在这里进行比较应该不会太难。添加了更多信息。抱歉没有早点提供。真棒。刚刚用50K行测试了这个,它可以工作。这是否有可能为我提供已删除的行。这只会返回新的、更新的行,并跳过删除。我尝试将第二个if语句更改为if(e1