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

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

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

阅读 31.9k
7 个回答
a.filter(key => !b.includes(key))
Array.prototype.diff = function(a) {
    return this.filter(function(i) {return a.indexOf(i) < 0;});
};
[1,2].diff([1]);//[2]  

计算 集合 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

这个或许对你有用:

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

对于集合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;
};

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

// 数组求差值
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);
function diff(arr1, arr2) {
  return arr1.concat(arr2).filter(function(arg){
    return !(arr1.indexOf(arg) >= 0 && arr2.indexOf(arg) >= 0);
  });
}
推荐问题
宣传栏