如何比较两个列表 - 在JavaScript中设置差异

时间:2014-09-16 21:00:53

标签: javascript set-difference

我确信这很容易(我是初学者!),但我找不到解决方案。

我想从.csv文件中导入两个数组,然后比较两个数组并返回在List1上显示的值,而不是在List2上。所以List1减去List2 =我的结果。

List1可能看起来像:100,200,300,400和List2 100,200。然后我想返回300,400。

(如果List 2碰巧有一些不在List 1中的值,我还是希望它能够运行而不是出错,但我认为它不会?)

提前感谢任何提示/指针或代码,如果你这么善良: - )

3 个答案:

答案 0 :(得分:0)

我们假设您有两个字符串,分隔值,如

var a= "100, 200, 400";
var b = "100, 200, 300";

您可以将这些值连接起来,使用String.split将它们转换为数组:

var items = (a +","+ b).split(',');

然后可以通过多种方式执行此操作,例如使用Array.prototype.reduce

items.reduce(function(a,c){  var count = a.filter(function(item){ return item ===c; }).length; if(count<1 ) a.push(c); return a;},[]);

答案 1 :(得分:0)

这似乎有效:

var array1 = [100,200,300,400];
var array2 = [200,100,400];
function array_diff(arr1,arr2)
{
    var x = Math.max(arr1.length,arr2.length);
    for(var i = 0; i < x; i++)
    {
        if(typeof arr1[i] !== 'undefined' && arr2.indexOf(arr1[i]) !== -1)
            arr1.splice(i,1);
        if(typeof arr2[i] !== 'undefined' && arr1.indexOf(arr2[i]) !== -1)
            arr1.splice(arr1.indexOf(arr2[i]),1);
    }
    return arr1;
}
console.log(array_diff(array1,array2));

我尽量避免使用Array.prototype.filterArray.prototype.reduce,因为它们与旧浏览器不兼容。据我所知,Array.prototype.splice有更好的支持。

如果您正在寻找速度提升,我可能会错,但我认为事先对数组进行排序会加快indexOf

http://jsfiddle.net/0tcyam2f/1/

答案 2 :(得分:0)

感谢您的回答!

我担心这段代码仍然比我的理解还要严重,所以我只是测试了各种选项,似乎没有任何错误消息就能得到所需结果的那个是来自What is the fastest or most elegant way to compute a set difference using Javascript arrays? 的那个正如Vache正确指出的那样:

A = [100,200,300];
B = [100,200,500];

diff_set = {
    ar : {},
    diff : Array(),
    remove_set : function(a) { ar = a; return this; },
    remove: function (el) {
        if(ar.indexOf(el)<0) this.diff.push(el);
    }
};

A.forEach(diff_set.remove_set(B).remove,diff_set);
C = diff_set.diff;

最初由Xavi Ivars

发布

感谢您提供答案!!非常感谢: - )