bin-charts
Version:
基于echarts的 vue插件,用于配合实现图表组件
133 lines (126 loc) • 4.55 kB
JavaScript
/**
* 防抖函数,返回函数连续调用时,空闲时间必须大于或等于 wait,func 才会执行
*
* @param {function} func 回调函数
* @param {number} wait 表示时间窗口的间隔
* @param {boolean} immediate 设置为ture时,是否立即调用函数
* @return {function} 返回客户调用函数
*/
function debounce(func, wait = 50, immediate = true) {
let timer, context, args
// 延迟执行函数
const later = () => setTimeout(() => {
// 延迟函数执行完毕,清空缓存的定时器序号
timer = null
// 延迟执行的情况下,函数会在延迟函数中执行
// 使用到之前缓存的参数和上下文
if (!immediate) {
func.apply(context, args)
context = args = null
}
}, wait)
// 这里返回的函数是每次实际调用的函数
return function (...params) {
// 如果没有创建延迟执行函数(later),就创建一个
if (!timer) {
timer = later()
// 如果是立即执行,调用函数
// 否则缓存参数和调用上下文
if (immediate) {
func.apply(this, params)
} else {
context = this
args = params
}
// 如果已有延迟执行函数(later),调用的时候清除原来的并重新设定一个
// 这样做延迟函数会重新计时
} else {
clearTimeout(timer)
timer = later()
}
}
}
/**
* 转换数据集
* @param opts 配置项 { xField:'x', yField:'y' ,seriesField:'可选'} // 分别为x轴映射字段,y轴映射字段,series 可选
* @param dataSource 元数据
* 元数据 [{x:'1月',y:'111',s:'系列一'},{x:'1月',y:'222',s:'系列二'},{x:'2月',y:'222',s:'系列一'},{x:'2月',y:'222',s:'系列二'}]
* 根据此种元数据类型来转换为dataset数据系列
*/
function formatDataSet(opts, dataSource) {
let { xField, yField, seriesField } = opts
if (!seriesField) {
return {
source: [
[xField, yField], ...dataSource.map(item => ([item[xField], item[yField]]))
]
}
} else {
const dimensions = []
const map = new Map()
dataSource.forEach(item => {
if (item[xField]) {
dimensions[0] = xField
}
if (item[seriesField]) {
if (!dimensions.includes(item[seriesField])) {
dimensions.push(item[seriesField])
}
}
if (map.has(item[xField])) {
map.set(item[xField], [...map.get(item[xField]), item[yField]])
} else {
map.set(item[xField], [item[xField], item[yField]])
}
})
return {
source: [dimensions, ...map.values()]
}
}
}
/**
* 转换成系列平铺数组,将分组的数据转换成dataset
* @param opts 平铺项名称 { xField:'x', yField:'y' ,seriesField:'可选,多系列必填'}
* @param data 包含一个对象数组[ {data:[],legend:'系列分组标记'} ...]
* 先转换为[
* {x:'1月',y:'111',s:'系列一'},{x:'1月',y:'222',s:'系列二'}
* {x:'2月',y:'222',s:'系列一'},{x:'2月',y:'222',s:'系列二'}
* ]
* 在根据此格式转换为dataset二维数组形式
*/
function formatSeries(opts, data) {
let { seriesField } = opts
if (!seriesField) {
console.error('seriesField is required')
return
}
let series = []
data.forEach(item => {
if (item[seriesField]) {
let seriesData = item.data.map(i => ({ ...i, [seriesField]: item[seriesField] }))
series = series.concat(seriesData)
}
})
return formatDataSet(opts, series)
}
/**
* 转换成类别分组数据,适用于未知系列条目数量的options配置,传统型数据的转换,方便遍历取值
* @param opts 平铺项名称 { xField:'x', yField:'y' ,seriesField:'可选,多系列必填'}
* @param data 包含一个对象数组[ {data:[],legend:'系列分组标记'} ...]
* return [{
* seriesName: "自然人"
* xAxis: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"]
* data: ["100", "200", "300", "500", "100", "200", "300", "500", "100", "200", "300", "500"]
* }]
*/
function formatDataSeries(opts, data) {
let { xField, yField, seriesField } = opts
return data.map(item => {
return {
seriesName: item[seriesField],
xAxis: item.data.map(i => i[xField]),
data: item.data.map(i => i[yField])
}
})
}
export { formatDataSet, formatSeries, formatDataSeries, debounce }