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

在这里插入图片描述

在这个例子中,我们首先使用 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
}

二、实现复制到剪贴板功能

方案一

navigator.clipboard.writeText 是一个现代浏览器提供的 API,用于将文本复制到剪贴板。它返回一个 Promise 对象,当文本成功复制到剪贴板时,Promise 会被解析。

在 Vue 中,你可以在方法中使用 navigator.clipboard.writeText:

methods: {
  async copyToClipboard(text) {
    try {
      await navigator.clipboard.writeText(text);
      console.log('复制成功');
    } catch (err) {
      console.error('复制失败', err);
    }
  }
}

在这个方法中,navigator.clipboard.writeText(text) 会尝试将 text 复制到剪贴板。如果复制成功,Promise 会被解析,并打印出 ‘复制成功’。如果复制失败,Promise 会被拒绝,并打印出 ‘复制失败’ 和错误信息。

然后,你可以在模板中使用这个方法:

<button @click="copyToClipboard('要复制的文本')">复制</button>

在这个例子中,当点击按钮时,会调用 copyToClipboard 方法,并将 ‘要复制的文本’ 作为参数传递给它。

注意,navigator.clipboard.writeText 需要在用户交互的上下文中(例如点击事件处理器)使用,否则它可能会被浏览器阻止。此外,一些旧的浏览器可能不支持 navigator.clipboard.writeText,你需要确保你的目标浏览器支持它。

方案二: 采用 下载 clipboard

安装插件

npm install clipboard --save
或
yarn add clipboard

案例:

import Clipboard from 'clipboard'
/**
 * 复制功能实现
 * @param textValue: 需要复制的文本
 * @param className: 触发复制的元素的类名
 */
export const copyHandle = async (textValue: string, className: string) => {
  const clipboard = new Clipboard(className, {
    text: function () {
      return textValue
    },
  })
  clipboard.on('success', () => {
    Message({
      type: 'success',
      message: '复制成功',
    })
    // 释放内存
    clipboard.destroy()
  })
  clipboard.on('error', () => {
    Message({
      type: 'error',
      message: '复制失败',
    })
    clipboard.destroy()
  })
}

案例使用

<mtd-button class="btn-demo-item copy-text" type="text" icon="export-o" @click="goCopyHandle">复制</mtd-button>
const  currentCodeMirrorValue = ref<string>(' ')
const goCopyHandle = async () => {
  console.log('复制表达式')
  copyHandle(currentCodeMirrorValue.value, '.copy-text')
}

三、一个对象格式化为 CSS 样式字符串

用于动态传入样式style
/**
 * formatTextStyleHandle 方法用于格式化文本样式
 * @param style 可选参数,一个对象,其键值对表示样式的属性和值
 * @returns 返回一个字符串,表示格式化后的样式内容,每个样式的属性和值用冒号分隔,每个样式之间用分号和空格分隔
 * 如果 style 参数不存在或为空,返回空字符串
 */
export const formatTextStyleHandle = (style?: { [key: string]: string }) => {
  // 判断 style 是否存在,如果存在,则将其转换为数组,并使用 map 方法遍历数组
  // 对于数组中的每个元素(即样式的属性和值),将其用冒号分隔,并返回一个新的数组
  // 最后,使用 join 方法将数组中的所有元素用分号和空格分隔,得到一个字符串
  // 如果 style 不存在或为空,返回空字符串
  const styleContent = style
    ? Object.entries(style)
        .map(([key, value]) => `${key}: ${value}`)
        .join('; ')
    : ''
  return styleContent
}
  • 这段代码的主要作用是将一个对象格式化为 CSS 样式字符串。
  • 函数 formatTextStyleHandle 接收一个可选参数 style,这是一个对象,其键值对应 CSS 样式的属性和值。
  • 如果 style 存在,使用 Object.entries(style) 将其转换为一个二维数组,每个子数组的第一个元素是属性名,第二个元素是属性值。
  • 使用 map 方法遍历这个二维数组,将每个子数组转换为一个字符串,形式为 “key: value”。
  • 使用 join('; ') 方法将所有的字符串连接起来,每两个字符串之间用分号和空格隔开。
  • 如果 style 不存在,返回空字符串。

代码解释:

export const formatTextStyleHandle = (style?: { [key: string]: string }) => {
  // 判断 style 是否存在
  const styleContent = style
    ? // 如果 style 存在,将其转换为二维数组,然后遍历这个数组,将每个子数组转换为一个字符串,最后将所有的字符串连接起来
      Object.entries(style)
        .map(([key, value]) => `${key}: ${value}`)
        .join('; ')
    : // 如果 style 不存在,返回空字符串
      ''
  return styleContent
}

例如,如果调用 formatTextStyleHandle({color: ‘red’, fontSize: ‘12px’}),则返回的结果是 ‘color: red; fontSize: 12px’。

使用
 const style = formatTextStyleHandle({color: 'red', fontSize: '12px'})
`<div class='format-tooltip' style='${style}'>xxx</div>`
  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值