手写lodash库里面的differenceBy函数

246 阅读1分钟

手写loadsh函数的第二天

 <script>
      const arr = [3.1, 2.2, 1.3];
      // 定义一个函数 differenceBy,用于计算两个数组的差异,通过给定的 identity 函数进行元素比较
      function differenceBy(array, values, identity) {
        let newArr = [];
        // 遍历第一个数组 array 中的每个元素
        for (const el of array) {
          // 检查对象的值是否为空数组(这里似乎有误,应该是检查对象的值不为空数组)
          if (Object.values(el) != []) {
            // 通过 identity 函数获取当前元素的标识值
            const item = identity(el);
            // 将标识值添加到新数组中
            newArr.push(item);
          }
        }
        // 遍历第二个数组 values 中的每个元素
        for (const el of values) {
          // 通过 identity 函数获取当前元素的标识值
          const item1 = identity(el);
          // 从新数组中过滤掉与当前标识值相等的元素
          newArr = newArr.filter((item) => {
            return item !== item1;
          });
        }
        // 将两个数组的值合并为一个新数组
        const arrayValues = [...array, ...values];
        // 遍历合并后的数组中的每个元素
        arrayValues.forEach((item) => {
          // 遍历新数组中的每个元素
          newArr.forEach((item1) => {
            // 如果当前元素与新数组中的元素通过 identity 函数比较相等
            if (identity(item) == item1) {
              // 将当前元素添加到新数组中
              newArr.push(item);
              // 从新数组中过滤掉与当前元素标识值相等的元素
              newArr = newArr.filter((item) => {
                return item !== item1;
              });
            }
          });
        });
        // 返回经过差异计算后的新数组
        return newArr;
      }
      // 调用 differenceBy 函数,传入数组 arr、[2.3, 2.5],以及 Math.floor 函数作为标识函数
      console.log(differenceBy(arr, [2.3, 2.5], Math.floor));
    </script>

使用chantgpt优化过的代码

const arr = [3.1, 2.2, 1.3];

// 定义函数 differenceBy,用于计算数组差异
function differenceBy(array, values, identity) {
  // 使用 Set 存储唯一的标识值
  const uniqueValues = new Set(values.map(identity));
  
  // 使用 filter 方法过滤掉在 values 数组中出现的元素
  return array.filter((item) => !uniqueValues.has(identity(item)));
}

// 调用 differenceBy 函数,传入数组 arr、[2.3, 2.5],以及 Math.floor 函数作为标识函数
console.log(differenceBy(arr, [2.3, 2.5], Math.floor));

//在这里实在是没有想到这种办法,不过也算是学到了点什么,看来还有待进步