【问题标题】:How to compare two lists - set difference in JavaScript如何比较两个列表 - 在 JavaScript 中设置差异
【发布时间】:2014-11-10 18:26:38
【问题描述】:

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

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

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

(如果列表 2 碰巧有一些不在列表 1 中的值,我希望它能够运行并且不报错,但我认为不会?)

提前感谢您提供的任何提示/指针或代码,如果您这么好心:-)

【问题讨论】:

标签: javascript set-difference


【解决方案1】:

假设您有 2 个带有 , 分隔值的字符串,例如

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;},[]);

【讨论】:

    【解决方案2】:

    这似乎有效:

    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/

    【讨论】:

      【解决方案3】:

      感谢您的回答!

      恐怕这段代码仍然有点超出我的理解,所以我只是测试了各种选项,并且似乎给出了预期结果而没有任何错误消息的代码是来自 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 发表

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-26
        • 2013-04-25
        • 2019-07-19
        • 1970-01-01
        • 1970-01-01
        • 2022-06-28
        • 1970-01-01
        • 2011-10-17
        相关资源
        最近更新 更多