js之零碎工具(四)

一、数组的去重

简单类型的去重
let arr = [1, 2, 2, 3, 4, 4, 5];
let uniqueArr = [...new Set(arr)];
console.log(uniqueArr); // 输出:[1, 2, 3, 4, 5]

在这个例子中,我们首先创建了一个新的 Set 对象,并将数组 arr 作为参数传递给 Set 的构造函数。这会创建一个新的 Set 对象,其中包含 arr 中的所有唯一值。然后,我们使用扩展运算符 … 将 Set 对象转换回数组。
(ps: 如果你的数组中包含对象,那么这种方法可能无法正确地去重,因为 Set 使用的是严格相等性检查 (===),所以 {} 和 {} 是不相等的。在这种情况下,你可能需要使用其他方法来去重。)

数组中包含对象的去重

如果数组中包含的对象,属性的顺序不同,但是属性值一样,我们仍然认为它们是相同的,那么我们可以先对对象的属性进行排序,然后再进行去重。

let arr = [
  { id: 1, name: 'Tom' },
  { name: 'Jerry', id: 2 },
  { id: 1, name: 'Tom' },
  { id: 3, name: 'Spike' },
  { name: 'Jerry', id: 2 }
];

let uniqueArr = Array.from(
  new Set(
    arr.map(item => {
      return JSON.stringify(
        Object.keys(item)
          .sort()
          .reduce((result, key) => {
            result[key] = item[key];
            return result;
          }, {})
      );
    })
  )
).map(item => JSON.parse(item));

console.log('uniqueArr', uniqueArr);

js之零碎工具(四)_第1张图片

在这个例子中,我们首先使用 Array.prototype.map 对数组中的每个对象进行处理。对于每个对象,我们先获取它的所有属性名,然后对属性名进行排序,然后使用 Array.prototype.reduce 创建一个新的对象,这个新的对象的属性是按照排序后的顺序添加的。然后我们将这个新的对象转换为字符串。

然后,我们使用 Set 来去重。最后,我们再次使用 Array.prototype.map 和 JSON.parse 将字符串转换回对象。
可以优化作为一个函数抛出

export function getUniqueObjArr(arr: any[]) {
  let uniqueArr = Array.from(
    new Set(
      arr.map((item: any) => {
        return JSON.stringify(
          Object.keys(item)
            .sort()
            .reduce((result: any, key) => {
              result[key] = item[key]
              return result
            }, {}),
        )
      }),
    ),
  ).map(item => JSON.parse(item))

  console.log('uniqueArr==', uniqueArr)
  return uniqueArr
}

你可能感兴趣的:(Vue,javascript,javascript,开发语言,ecmascript)