xcn
Version:
一个用于字符串拼接的小工具,多用于 class name 的拼接
63 lines (60 loc) • 2.02 kB
JavaScript
import { isTrue, isArray, isString, isNumber, isFunction, isUndefined } from '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 (isUndefined(newValue) || !isString(newValue))
return;
const newList = removeBlank(newValue).split(' ');
if (newList.length)
template.push(...newList);
};
classNameList.forEach(classNameItem => {
// 数据为 undefined 或 null 或 false 或 true 或 '' 或 [] 或 {}
if (!classNameItem || isTrue(classNameItem))
return;
// 数据为数组类型
if (isArray(classNameItem))
classNameItem.forEach(childItem => mergeNewValue(xcn(childItem)));
// 数据为 string 类型
else if (isString(classNameItem) || isNumber(classNameItem))
mergeNewValue(classNameItem.toString());
// 数据为函数类型
else if (isFunction(classNameItem)) {
const result = classNameItem();
if (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);
}
export { xcn as default, xcn };