bin-ui
Version:
基于 vue2.6 / vue-cli3 的 UI 组件库
60 lines (54 loc) • 1.55 kB
JavaScript
/*
inspired by https://www.npmjs.com/package/react-csv-downloader
now removed from Github
*/
const newLine = '\r\n'
const appendLine = (content, row, { separator, quoted }) => {
const line = row.map(data => {
if (!quoted) return data
// quote data
data = typeof data === 'string' ? data.replace(/"/g, '"') : data
return `"${data}"`
})
content.push(line.join(separator))
}
const defaults = {
separator: ',',
quoted: false
}
export default function csv(columns, datas, options, noHeader = false) {
options = Object.assign({}, defaults, options)
let columnOrder
const content = []
const column = []
if (columns) {
columnOrder = columns.map(v => {
if (typeof v === 'string') return v
if (!noHeader) {
column.push(typeof v.title !== 'undefined' ? v.title : v.key)
}
return v.key
})
if (column.length > 0) appendLine(content, column, options)
} else {
columnOrder = []
datas.forEach(v => {
if (!Array.isArray(v)) {
columnOrder = columnOrder.concat(Object.keys(v))
}
})
if (columnOrder.length > 0) {
columnOrder = columnOrder.filter((value, index, self) => self.indexOf(value) === index)
if (!noHeader) appendLine(content, columnOrder, options)
}
}
if (Array.isArray(datas)) {
datas.forEach(row => {
if (!Array.isArray(row)) {
row = columnOrder.map(k => (typeof row[k] !== 'undefined' ? row[k] : ''))
}
appendLine(content, row, options)
})
}
return content.join(newLine)
}