登录

javascript - 关于 js 2个数组取差集怎么取?

var arr1 =  [1];   
var arr2 =  [1,2];

请问请注意 第一个数组 比第二个数组数量少!

# JavaScript
ringa_leeringa_lee2266 天前492 次浏览

全部回复(6) 我要回复

  • 天蓬老师

    天蓬老师2017-04-11 11:45:23

    Array.prototype.diff = function(a) {
        return this.filter(function(i) {return a.indexOf(i) < 0;});
    };
    [1,2].diff([1]);//[2]  
    

    回复
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-11 11:45:23

    a.filter(key => !b.includes(key))

    回复
    0
  • 巴扎黑

    巴扎黑2017-04-11 11:45:23

    这个或许对你有用:

    var isNaN = Number.isNaN;
    var difference = function(arr1, arr2) {
        return arr1.reduce(function(previous, i) {
            var found = arr2.findIndex(function(j) {
                return j === i || (isNaN(i) && isNaN(j));
            });
            return (found < 0 && previous.push(i), previous);
        }, []);
    };
    
    
    var arr1 = [1];
    var arr2 = [1, 2];
    
    console.log(difference(arr2, arr1)); //[ 2 ]

    参考:开开心心做几道JavaScript机试题 - 02

    回复
    0
  • PHP中文网

    PHP中文网2017-04-11 11:45:23

    对于集合A、B,我们把集合{x∣x∈A,且x∉B}叫做A与B的差集

    首先考虑到的是 ES6 的 Set 来处理,这是真正按照数学上的集合来进行的,不会有重复元素:

    var subSet = function(arr1, arr2) {
        var set1 = new Set(arr1);
        var set2 = new Set(arr2);
    
        var subset = [];
    
        for (let item of set1) {
            if (!set2.has(item)) {
                subset.push(item);
            }
        }
    
        return subset;
    };

    其次,常规办法,不负责去重:

    var subSet = function(arr1, arr2) {
        var len = arr1.length;
        var arr = [];
    
        while (len--) {
            if (arr2.indexOf(arr1[len]) < 0) {
                arr.push(arr1[len]);
            }
        }
    
        return arr;
    };

    回复
    0
  • 天蓬老师

    天蓬老师2017-04-11 11:45:23

    看看这个能不能符合你的需求

    // 数组求差值
    var arr1 = [1, 2, 4, 9, 0];
    var arr2 = [2, 4, 7, 8];
    
    var difference = function(arr1, arr2) {
      var diff = [];
      var tmp = arr2;
    
      arr1.forEach(function(val1, i){
        if (arr2.indexOf(val1) < 0) {
          diff.push(val1);
        } else {
          tmp.splice(tmp.indexOf(val1), 1);
        }
      });
    
      console.log(diff.concat(tmp));
    }
    
    // 输出 [ 1, 9, 0, 7, 8 ]
    difference(arr1, arr2);
    

    回复
    0
  • 黄舟

    黄舟2017-04-11 11:45:23

    计算 集合 a-b:

    a.filter(ea=>b.every(eb=>eb!==ea));
    

    代码解释

    filter筛选a集合的元素,如果当前筛选的元素与b集合中的every每一个元素都不相等vb!==va,则将此元素加入到返回集合中


    补充说明:

    • Array.prototype.filter循环数组的每个元素并计算

      • 如果返回true,则将元素加入到返回的集合中

      • 如果返回false,则跳过


    • Array.prototype.every循环数组的每个元素并计算

      • 如果所有计算结果都为true,则返回true

      • 否则返回 false

    回复
    0
  • 取消回复发送