xcn
Version:
一个用于字符串拼接的小工具,多用于 class name 的拼接
68 lines (63 loc) • 2.14 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
var aTypeOfJs = require('a-type-of-js');
/**
*
* 合并 class
*
* merge class name
*
*/
function xcn(...classNameList) {
/** 临时 */
const template = [];
/** 移除空白 */
const removeBlank = (str) => str
.trim()
.replace(/undefined/g, ' ')
.replace(/\s+/g, ' ')
.split(' ')
.sort()
.join(' ');
/** 混合值 */
const mergeNewValue = (newValue) => {
if (aTypeOfJs.isUndefined(newValue) || !aTypeOfJs.isString(newValue))
return;
const newList = removeBlank(newValue).split(' ');
if (newList.length)
template.push(...newList);
};
classNameList.forEach(classNameItem => {
// 数据为 undefined 或 null 或 false 或 true 或 '' 或 [] 或 {}
if (!classNameItem || aTypeOfJs.isTrue(classNameItem))
return;
// 数据为数组类型
if (aTypeOfJs.isArray(classNameItem))
classNameItem.forEach(childItem => mergeNewValue(xcn(childItem)));
// 数据为 string 类型
else if (aTypeOfJs.isString(classNameItem) || aTypeOfJs.isNumber(classNameItem))
mergeNewValue(classNameItem.toString());
// 数据为函数类型
else if (aTypeOfJs.isFunction(classNameItem)) {
const result = classNameItem();
if (aTypeOfJs.isString(result))
mergeNewValue(result);
else
result.forEach(item => mergeNewValue(xcn(item)));
}
else {
// 数据为 object 类型
for (const key in classNameItem) {
if (Object.prototype.hasOwnProperty.call(classNameItem, key)) {
const element = classNameItem[key];
if (true === element)
mergeNewValue(key);
}
}
}
});
const result = removeBlank(Array.from(new Set(template)).filter(Boolean).join(' '));
return (result ?? undefined);
}
exports.default = xcn;
exports.xcn = xcn;