手写之difference(数组)

43 阅读1分钟

乘风破浪会有时,直挂云帆济沧海

仿写lodash的difference

feature

根据第二个参数进行过滤返回一个新的数组。

    difference([{id:1},{id:2}],[{id:2}],(item)=>item.id)
    // [{id:1}]
    difference([1,2,3],[1])
    // [2,3]

实现

    function difference(array,values,comparator){ 
       const isArrayOfArray = Array.isArray(array);
       const isArrayOfValues = Array.isArray(values);
       //判断是否有空值,跳过处理
       if(!isArrayOfArray && !isArrayOfValues)return [];
       if(!isArrayOfArray && isArrayOfValues)return values;
       if(isArrayOfArray && !isArrayOfValues)return array;
 
       let result = [];
       outer: for(let prop of array){
          const computed= comparator?comparator(prop):prop;
          let index = values.length;
          while(index--){
          const _computedValue = comparator?comparator(values[index]):values[index];
              if(_computedValue === computed){
              // 如果两个值相同跳出当前循环
                  continue outer;
              }
          }
          result.push(value);
       }
       return result;
     }