tools-for-js
Version:
基于babel构建的JavaScript前端工具库
304 lines (291 loc) • 11 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getValueFromArray = exports.getPagination = exports.deWeightArray = exports.checkKeyEmpty = exports.arrayToTree = exports.arrExchange = exports.arrEleMove = void 0;
exports.invertSelection = invertSelection;
exports.randomNumEnum = void 0;
exports.shuffleArray = shuffleArray;
exports.treeLastChildSum = exports.sortByKeyAndTime = void 0;
var _calculate = require("./calculate");
var _common = require("./common");
var _object = require("./object");
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
/*******
* @description: 数组去重
* @author: 琴时
* @param {Array} list [需要去重的数组对象]
* @param {String} key [指定数组对象元素主键]
* 以该主键的值为标准判断数据是否重复|如果数组元素是一般数据类型,key传空即可
* @param {Function} callback [回调函数,用于处理去重后重复的数据(可不传)]
* @return {Array} 去重后的新数组对象
*/
var deWeightArray = exports.deWeightArray = function deWeightArray(list, key, callback) {
/* 如果数组的元素是基本数据类型那就不传第二个参数 */
if (!key) {
var set = new Set(list);
return _toConsumableArray(set);
}
var tempList = []; //重复数据
var map = new Map(); //创建Map对象数据结构
// 遍历需要去重的数组对象
list.forEach(function (item) {
// 判断map对象中该key是否已经存在
if (!map.has(item[key])) {
map.set(item[key], item); //如果不存在,将该数据插入
} else {
tempList.push(item);
}
});
(0, _common.IsType)('Function', callback) && callback(tempList);
return _toConsumableArray(map.values()); //将map对象转换回数组再返回
};
/*******
* @description: [递归]计算树的最后节点某字段的总和
* @author: 琴时
* @param {Array} tree [数组树对象]
* @param {Object} config [配置参数]
* @param {String} config.key [目标节点名称]
* @param {String} config.children [递归树节点名称]
* @returns {Number} [目标节点某字段的总和]
* @example: treeLastChildSum(tree, { key: 'price', children: 'children' })
*/
var treeLastChildSum = exports.treeLastChildSum = function treeLastChildSum(tree, config) {
var _ref = config || {},
_ref$key = _ref.key,
key = _ref$key === void 0 ? 'id' : _ref$key,
_ref$children = _ref.children,
children = _ref$children === void 0 ? 'children' : _ref$children;
var sumList = []; //缓存目标节点值
var traverseTree = function traverseTree(tree, list, key, children) {
tree.forEach(function (item) {
if (item[children] && item[children].length > 0) {
traverseTree(item[children], list, key, children);
} else if (item[key]) {
list.push(item[key]);
}
});
};
traverseTree(tree, sumList, key, children);
return (0, _calculate.summation)(sumList);
};
/*******
* @description: 校验数组对象中是否存在指定的字段为空
* @author: 琴时
* @param {Array} list [校验的数组对象]
* @param {Array} keyList [校验指定的字段-数组形式]
* @return {Array} 返回存在空的字段数组
* @example: checkKeyEmpty(tree, ['id', 'name'])
*/
var checkKeyEmpty = exports.checkKeyEmpty = function checkKeyEmpty(list, keyList) {
var temp = [];
var loops = function loops(array, key) {
array.some(function (item) {
if ((0, _common.isEmpty)(item[key])) {
// 存在空的字段
temp.push(key);
return true;
} else if (item.children && item.children.length > 0) {
loops(item.children, key);
}
});
};
keyList.forEach(function (key) {
loops(list, key);
});
return temp;
};
/*******
* @description: 移动数组元素
* @author: 琴时
* @param {Array} list
* @param {Number} from [移动的位置]
* @param {Number} to [目标位置]
* @return {Array}
*/
var arrEleMove = exports.arrEleMove = function arrEleMove(list, from, to) {
list = list.slice();
list.splice(to < 0 ? list.length + to : to, 0, list.splice(from, 1)[0]);
return list;
};
/*******
* @description: 数组元素交换位置
* @author: 琴时
* @param {Array} list
* @param {Number} i1
* @param {Number} i2
* @return {Array}
*/
var arrExchange = exports.arrExchange = function arrExchange(list, i1, i2) {
list = list.slice();
var item = list[i1];
list[i1] = list[i2];
list[i2] = item;
return list;
};
/*******
* @description: 数组格式转树状结构
* @author: 琴时
* @param {Array} array
* @param {Object} config
* @param {String} config.id [主键名]
* @param {String} config.pid [父级主键名]
* @param {String} config.children [子级数组名]
* @return {Array} [树状结构数组]
*/
var arrayToTree = exports.arrayToTree = function arrayToTree(array, config) {
var _ref2 = config || {},
_ref2$id = _ref2.id,
id = _ref2$id === void 0 ? 'id' : _ref2$id,
_ref2$pid = _ref2.pid,
pid = _ref2$pid === void 0 ? 'pid' : _ref2$pid,
_ref2$children = _ref2.children,
children = _ref2$children === void 0 ? 'children' : _ref2$children;
var data = (0, _common.deepCopy)(array);
var result = [];
var hash = {};
data.forEach(function (_, index) {
hash[data[index][id]] = data[index];
});
data.forEach(function (item) {
var hashVP = hash[item[pid]];
if (hashVP) {
!hashVP[children] && (hashVP[children] = []);
hashVP[children].push(item);
} else {
result.push(item);
}
});
return result;
};
/*******
* @description: 根据label的值获取value
* @author: 琴时
* @param {Array} list
* @param {String} labelVal [label的值]
* @return {*}
*/
var getValueFromArray = exports.getValueFromArray = function getValueFromArray(list, labelVal) {
var label = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'label';
var value = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'value';
list = (0, _common.deepCopy)(list);
var res = list.find(function (item) {
return item[label] == labelVal;
}) || {};
return res[value];
};
/*******
* @description: 随机抽取数组中的n个值
* @author: 琴时
* @param {Array} array
* @param {Number} num
* @return {Array}
*/
var randomNumEnum = exports.randomNumEnum = function randomNumEnum(array, num) {
var shuffled = array.slice(0),
i = array.length,
min = i - num,
temp,
index;
while (i-- > min) {
index = Math.floor((i + 1) * Math.random());
temp = shuffled[index];
shuffled[index] = shuffled[i];
shuffled[i] = temp;
}
return shuffled.slice(min);
};
/*******
* @description: 计算数据分页
* @author: 琴时
* @param {Array} list
* @param {Number} params.page [当前页码]
* @param {Number} params.pageSize [每页显示条数]
* @return {Array}
*/
var getPagination = exports.getPagination = function getPagination(list, params) {
var page = params.page,
pageSize = params.pageSize;
list = (0, _common.deepCopy)(list);
return list.slice((page - 1) * pageSize, page * pageSize);
};
/*******
* @description: 根据[key]值排序,相同时则根据时间[timeKey]值排序
* @author: 琴时
* @param {*} list
* @param {String} config.key [排序字段]
* @param {String} config.timeKey [时间字段]
* @param {String} config.order [排序方式,默认升序]
* @param {String} config.timeOrder [时间排序方式,默认降序]
* @return {Array}
*/
var sortByKeyAndTime = exports.sortByKeyAndTime = function sortByKeyAndTime(list, config) {
var _ref3 = config || {},
_ref3$key = _ref3.key,
key = _ref3$key === void 0 ? 'sticky' : _ref3$key,
_ref3$timeKey = _ref3.timeKey,
timeKey = _ref3$timeKey === void 0 ? 'date' : _ref3$timeKey,
_ref3$order = _ref3.order,
order = _ref3$order === void 0 ? 'asc' : _ref3$order,
_ref3$timeOrder = _ref3.timeOrder,
timeOrder = _ref3$timeOrder === void 0 ? 'desc' : _ref3$timeOrder;
list = (0, _common.deepCopy)(list);
return list.sort(function (a, b) {
var a_val = (0, _object.getValByKey)(a, key);
var a_time = +new Date((0, _object.getValByKey)(a, timeKey));
var b_val = (0, _object.getValByKey)(b, key);
var b_time = +new Date((0, _object.getValByKey)(b, timeKey));
if (a_val === b_val) {
return timeOrder === 'desc' ? b_time - a_time : a_time - b_time;
}
return order === 'asc' ? a_val - b_val : b_val - a_val;
});
};
/*******
* @description: 数组随机打乱
* @author: 琴时
* @param {Array} arr
* @return {Array}
*/
function shuffleArray(arr) {
var array = _toConsumableArray(arr);
for (var i = array.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var _ref4 = [array[j], array[i]];
array[i] = _ref4[0];
array[j] = _ref4[1];
}
return array;
}
/*******
* @description: 数组反选: 选中元素与未选中元素反转
* @author: 琴时
* @param {Array} list
* @param {*} elem [选中的元素]
* @param {*} key [反转目标元素]
* @return {Array}
* @example
* invertSelection([1, 2], 'all', 'all') => ['all']
* invertSelection(['all'], 1, 'all') => [1]
* invertSelection([1, 2, 3], 3, 'all') => [1, 2]
* invertSelection([1, 2], 3, 'all') => [1, 2, 3]
*/
function invertSelection(list, elem) {
var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'all';
if (list.includes(elem)) {
list = list.filter(function (item) {
return item !== elem;
});
} else {
list.push(elem);
}
// element=key 时,直接返回[key],否则将key从list中删除
return list.filter(function (item) {
return item === key === (elem === key);
});
}