搜尋

首頁  >  問答  >  主體

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

1

2

<code>var arr1 =  [1];  

var arr2 =  [1,2];</code>

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

ringa_leeringa_lee2875 天前685

全部回覆(6)我來回復

  • 天蓬老师

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

    1

    2

    3

    4

    5

    <code>Array.prototype.diff = function(a) {

        return this.filter(function(i) {return a.indexOf(i) < 0;});

    };

    [1,2].diff([1]);//[2] 

    </code>

    回覆
    0
  • 伊谢尔伦

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

    1

    <code class="javascript">a.filter(key => !b.includes(key))</code>

    回覆
    0
  • 巴扎黑

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

    这个或许对你有用:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    <code class="javascript">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 ]</code>

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

    回覆
    0
  • PHP中文网

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

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

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

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    <code>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;

    };</code>

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

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    <code>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;

    };</code>

    回覆
    0
  • 天蓬老师

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

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

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    <code class="javascript">// 数组求差值

    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);

    </code>

    回覆
    0
  • 黄舟

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

    计算 集合 a-b:

    1

    2

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

    </code>

    代码解释

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


    补充说明:

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

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

      • 如果返回false,则跳过


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

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

      • 否则返回 false

    回覆
    0
  • 取消回覆