vue-ant-patterns
Version:
vue-ant-patterns
272 lines (232 loc) • 7.65 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.listToTreeDefault = exports.relationGetKeyName = exports.relationSetHandler = exports.relationHandler = exports.treeToList = exports.listToTree = exports.listToLevel2Tree = undefined;
var _extends2 = require('babel-runtime/helpers/extends');
var _extends3 = _interopRequireDefault(_extends2);
var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray');
var _slicedToArray3 = _interopRequireDefault(_slicedToArray2);
var _extend = require('extend');
var _extend2 = _interopRequireDefault(_extend);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var listToTreeDefaultOps = {
// 关系
rel: ['id', 'parentId'],
// 根条件
parent: function parent(item, ops) {
var _ops$rel = (0, _slicedToArray3['default'])(ops.rel, 2),
id = _ops$rel[0],
parId = _ops$rel[1];
return relationHandler(parId, item) === null || relationHandler(parId, item) === 'null' || relationHandler(parId, item) === '-1';
},
// 子级条件
children: function children(item, parent, ops) {
var _ops$rel2 = (0, _slicedToArray3['default'])(ops.rel, 2),
id = _ops$rel2[0],
parId = _ops$rel2[1];
return relationHandler(parId, item) === relationHandler(id, parent);
}
};
/*
listToTree 用例
const menuList = listToTree(list, {}, {
rel: ['id', 'parentId'],
parent (item) { return item.parentId === null },
children (item, parent) { return item.parentId === parent.id; }
});
console.log(JSON.stringify(menuList));
*/
/**
* 获取最后一个 key name
*/
function relationGetKeyName(property) {
var l = property.length;
if (Array.isArray(property) && l === 1) {
return relationGetKeyName(property[0]);
}
if (Array.isArray(property) && l >= 1) {
return relationGetKeyName(property[l - 1]);
}
return property;
}
/**
* 获取某一属性值
* @param {String || Array } property 字符串, 数组, 多维数组, 多维数组为 keyPath
* @param {Object} source
*/
function relationHandler(property, source) {
if (!source) return null;
if (Array.isArray(property) && property.length === 1) {
return relationHandler(property[0], source);
}
if (Array.isArray(property) && property.length > 1) {
var o = null;
return property.reduce(function (o, it) {
// if (o) {
// return o[it];
// } else {
// console.log(it, source);
// return source[it];
// }
o = o ? o[it] : source[it];
return o;
}, o);
} else {
return source[property];
}
}
/**
* 设置属性值
* @param {*} property 字符串, 数组, 多维数组
* @param {*} value
* @param {*} source
*/
function relationSetHandler(property, value, source) {
if (!property || value === undefined || !source) {
return source;
}
if (Array.isArray(property)) {
var tmp = (0, _extends3['default'])({}, source);
property.reduce(function (o, k) {
if (o[k] === undefined) {
o[k] = {};
}
if (k === property[property.length - 1]) {
o[k] = value;
}
return o[k];
}, tmp);
return tmp;
} else {
source[property] = value;
}
return source;
}
/**
* list 转 tree 支持多根节点, 支传入匹配条件
* @param {*} list
* @param {*} target
* @param {*} ops
*/
function listToTree() {
var list = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
var target = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var ops = arguments[2];
if (ops === undefined) {
return listToTreeDefault(list);
}
ops = ops || {};
var cloneList = (0, _extend2['default'])(true, [], list);
var cloneOps = (0, _extend2['default'])(true, listToTreeDefaultOps, ops);
var rel = cloneOps.rel,
parent = cloneOps.parent,
sC = cloneOps.children;
var _rel = (0, _slicedToArray3['default'])(rel, 2),
opsId = _rel[0],
opsParentId = _rel[1];
var toTree = function toTree() {
var vList = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
var vTarget = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var _ref = vTarget || {},
children = _ref.children;
return vList.reduce(function (m, it) {
/**
* 通过 id parentId 关系, 判断是否有子节点
*/
var isChildren = cloneList.filter(function (t) {
// 两个节点都是根
if (parent(t, cloneOps) && parent(it, cloneOps)) return false;
return relationHandler(opsParentId, t) === relationHandler(opsId, it);
});
if (isChildren && isChildren.length) {
it.children = [];
toTree(isChildren, it);
}
// 是否根
if (parent(it, cloneOps)) {
m.push(it);
} else {
if (sC(it, vTarget, cloneOps) && vTarget) {
m.push(it);
}
}
return m;
}, children || []);
};
return toTree(cloneList, target);
}
function listToLevel2Tree() {
var list = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
var ops = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : listToTreeDefaultOps;
var cloneList = (0, _extend2['default'])(true, [], list);
var cloneOps = (0, _extend2['default'])(true, {}, listToTreeDefaultOps, ops);
var rel = cloneOps.rel,
parent = cloneOps.parent,
children = cloneOps.children;
var _rel2 = (0, _slicedToArray3['default'])(rel, 2),
id = _rel2[0],
parentId = _rel2[1];
return cloneList.reduce(function (m, it, idx, raw) {
var nIt = (0, _extends3['default'])({}, it);
if (raw.find(function (subIt) {
return relationHandler(parentId, subIt) === relationHandler(id, nIt);
}) && parent(nIt, cloneOps)) {
nIt.children = [];
nIt.children = raw.map(function (item) {
if (relationHandler(parentId, item) === relationHandler(id, it)) {
return item;
}
}).filter(function (T) {
return T;
});
} else {
nIt.children = null;
}
if (parent(nIt, cloneOps)) {
m.push(nIt);
}
return m;
}, []);
}
function treeToList() {
var list = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
var target = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
var cloneList = (0, _extend2['default'])(true, [], list);
cloneList.map(function (it) {
target.push(it);
if (it.children) {
treeToList(it.children, target);
}
});
return target;
}
var listToTreeDefault = function listToTreeDefault(list) {
var treeMenu = [];
function toTree(list) {
var tree = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
var parentId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '-1';
list.map(function (item) {
if (item.parentId === parentId) {
var child = (0, _extends3['default'])({}, item, {
children: []
});
toTree(list, child.children, item.id);
if (child.children.length <= 0) {
delete child.children;
}
tree.push(child);
}
});
}
toTree(list, treeMenu);
return treeMenu;
};
exports.listToLevel2Tree = listToLevel2Tree;
exports.listToTree = listToTree;
exports.treeToList = treeToList;
exports.relationHandler = relationHandler;
exports.relationSetHandler = relationSetHandler;
exports.relationGetKeyName = relationGetKeyName;
exports.listToTreeDefault = listToTreeDefault;
exports['default'] = listToTree;