JS-Utils

MergeObjects

/**
 * Merge an array of objects into one.
 *
 * @param {Array<Object>} arr
 * @return {Object}
 */

export function mergeObjects (arr) {
  return arr.reduce((prev, obj) => {
    Object.keys(obj).forEach(key => {
      const existing = prev[key]
      if (existing) {
        // allow multiple mutation objects to contain duplicate
        // handlers for the same mutation type
        if (Array.isArray(existing)) {
          existing.push(obj[key])
        } else {
          prev[key] = [prev[key], obj[key]]
        }
      } else {
        prev[key] = obj[key]
      }
    })
    return prev
  }, {})
}

DeepClone

/**
 * Deep clone an object. Faster than JSON.parse(JSON.stringify()).
 *
 * @param {*} obj
 * @return {*}
 */

export function deepClone (obj) {
  if (Array.isArray(obj)) {
    return obj.map(deepClone)
  } else if (obj && typeof obj === 'object') {
    var cloned = {}
    var keys = Object.keys(obj)
    for (var i = 0, l = keys.length; i < l; i++) {
      var key = keys[i]
      cloned[key] = deepClone(obj[key])
    }
    return cloned
  } else {
    return obj
  }
}

TreeUtils

// 并
export function treeDataUnion(left, right, key = 'id', childrenKey = 'children') {
  if (!right) return left
  right.forEach(r_item => {
    const index = left.findIndex(l_item => l_item[key] === r_item[key])
    if (index === -1) {
      left.push(r_item)
    } else {
      left[index][childrenKey] = treeDataUnion(left[index][childrenKey], r_item[childrenKey])
    }
  })
  return left
}
// 差集
export function treeDataSub(left, right, key = 'id', childrenKey = 'children') {
  if (!right) return left
  right.forEach(r_item => {
    const index = left.findIndex(l_item => l_item[key] === r_item[key])
    if (index !== -1) {
      if (!left[index][childrenKey]) left.splice(index, 1)
      else {
        left[index][childrenKey] = treeDataSub(left[index][childrenKey], r_item[childrenKey])
        if (!left[index][childrenKey] || left[index][childrenKey].length === 0) left.splice(index, 1)
      }
    }
  })
  return left
}
// 排序
export function treeSort(data, childrenKey, sortKey) {
  // 改变原数据
  if (!childrenKey || !sortKey) return
  if (!data || data.length === 0) return
  data.sort((a, b) => {
    if (!(!!b[childrenKey] ^ !!a[childrenKey])) return (b[sortKey] + '').localeCompare(a[sortKey] + '', 'zh')
    else return b[childrenKey] ? 1 : -1
  })
  data.forEach(item => {
    treeSort(item[childrenKey], childrenKey, sortKey)
  })
  return data
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注