/**
 * 工具组件集合
 */

/**
 * 清理数组中的空值或空对象
 * @param {Array} children - 要处理的数组，默认为空数组
 * @returns {Array} - 过滤后的数组
 */
export function filterEmpty(children = []) {
  // 使用Array.prototype.filter方法移除数组中的空值或空对象
  return children.filter(c => c.tag || (c.text && c.text.trim() !== ''))
}

/**
 * 获取字符串的完整长度，英文字符长度为1，中文字符长度为2
 * @param {string} str - 要处理的字符串，默认为空字符串
 * @returns {number} - 字符串的完整长度
 */
export const getStrFullLength = (str = '') =>
  // 使用Array.prototype.split方法将字符串转换为字符数组
  str.split('').reduce((pre, cur) => {
    // 获取字符的Unicode编码
    const charCode = cur.charCodeAt(0)
    // 如果字符是ASCII字符（英文字符），则长度加1
    if (charCode >= 0 && charCode <= 128) {
      return pre + 1
    }
    // 如果字符是双字节字符（中文字符），则长度加2
    return pre + 2
  }, 0)

/**
 * 根据最大长度截取字符串，保留完整字符
 * @param {string} str - 要截取的字符串，默认为空字符串
 * @param {number} maxLength - 最大长度，默认无限制
 * @returns {string} - 截取后的字符串
 */
export const cutStrByFullLength = (str = '', maxLength) => {
  let showLength = 0
  // 使用Array.prototype.split方法将字符串转换为字符数组
  return str.split('').reduce((pre, cur) => {
    // 获取字符的Unicode编码
    const charCode = cur.charCodeAt(0)
    // 如果字符是ASCII字符（英文字符），则长度加1
    if (charCode >= 0 && charCode <= 128) {
      showLength += 1
    } else {
      // 如果字符是双字节字符（中文字符），则长度加2
      showLength += 2
    }
    // 如果当前长度小于等于最大长度，则继续累加字符
    if (showLength <= maxLength) {
      return pre + cur
    }
    // 如果超过最大长度，则返回当前累加的字符串
    return pre
  }, '')
}