/** * @Author: jianglei * @Date: 2017-10-12 12:06:49 */ 'use strict' import Vue from 'vue' export default function treeToArray(data, expandAll, parent, level, item) { const marLTemp = [] let tmp = [] Array.from(data).forEach(function(record) { if (record._expanded === undefined) { Vue.set(record, '_expanded', expandAll) } let _level = 1 if (level !== undefined && level !== null) { _level = level + 1 } Vue.set(record, '_level', _level) // 如果有父元素 if (parent) { Vue.set(record, 'parent', parent) // 如果父元素有偏移量,需要计算在this的偏移量中 // 偏移量还与前面同级元素有关,需要加上前面所有元素的长度和 if (!marLTemp[_level]) { marLTemp[_level] = 0 } Vue.set(record, '_marginLeft', marLTemp[_level] + parent._marginLeft) Vue.set(record, '_width', record[item] / parent[item] * parent._width) // 在本次计算过偏移量后加上自己长度,以供下一个元素使用 marLTemp[_level] += record._width } else { // 如果为根 // 初始化偏移量存储map marLTemp[record.id] = [] // map中是一个数组,存储的是每级的长度和 // 初始情况下为0 marLTemp[record.id][_level] = 0 Vue.set(record, '_marginLeft', 0) Vue.set(record, '_width', 1) } tmp.push(record) if (record.children && record.children.length > 0) { const children = treeToArray(record.children, expandAll, record, _level, item) tmp = tmp.concat(children) } }) return tmp }