npm模块学习之arr-diff
发布于 6 年前 作者 sunfeng90 3300 次浏览 来自 分享

1、git地址

https://github.com/jonschlinkert/arr-diff

2、作用

计算所给数组与其他数组不同的元素,并生成一个新数组

3、例子和源码解析

3.1 例子

const diff = require('arr-diff');

let arrayOne = ['a', 'b', 'c', 'd'];
let arrayTwo = ['b', 'd'];
console.log(diff(arrayOne, arrayTwo)) // 输出:['a', 'c']

let arrayThree = ['e', 'f', 'g', 'h'];
let arrayFour = ['i', 'e'];
let arrayFive = ['g', 'e'];
console.log(diff(arrayThree, arrayFour, arrayFive)) // 输出:['f', 'h']

3.2 源码及解析

function diff(arr) {
 var len = arguments.length; // 充分利用了arguments,即使diff只有一个参数名,但是可以传多个参数数组, 这样可以让多个数组进行比较

 var idx = 0;
 while (++idx < len) {
   arr = diffArray(arr, arguments[idx]); // 拿第一个数组与其他数组进行比较。比较的结果再与其他数组比较
 }
 return arr;
};

function diffArray(one, two) {
 if (!Array.isArray(two)) { // 如何two不是数组,就浅拷贝并返回
   return one.slice();
 }

 var tlen = two.length;
 var olen = one.length;
 var idx = -1;
 var arr = [];

 while (++idx < olen) { // 遍历第一个数组
   var ele = one[idx];

   var hasEle = false;
   for (var i = 0; i < tlen; i++) { // 拿第一个数组的元素与第二个数组的每个元素进行比较
     var val = two[i];

     if (ele === val) { // 如果第二个数组存在该元素,就停止遍历
       hasEle = true;
       break;
     }
   }

   if (hasEle === false) {
     arr.push(ele);
   }
 }
 return arr;
}
1 回复

顶一个

回到顶部