Javascript 字符串模板
topcss opened this issue · comments
Jack commented
// 增加一些模板处理的方法
Object.assign(String.prototype, {
/**
* 用正则替换对应的字符串,并且生成多个模板代码
* 基于模板(列表,正则)
*/
toMany(listStr, reg) {
let list = [];
listStr.split(',').map(item => list.push(this.replace(reg, item)));
return list.join('');
},
/**
* 按顺序替换字符串
* 基于内容(列表,正则)
*/
replaceList(listStr, reg) {
let list = listStr.split(','), index = 0;
return this.replace(reg, (e, i) => list[index++]);
},
/**
* 通过自定义函数,来替换指定的值
* 基于内容(正则,函数)
*/
replaceByFn(reg, fn) {
let index = 0;
return this.replace(reg, (item) => fn(item, (index++)));
}
});
Object.assign(Array.prototype, {
/**
* 如果数组有重复,就重命名+1,可用于数据库字段命名,文件夹命名
*/
uniq() {
let list = [], c={};
for(let i = 0; i < this.length; i++){
let item = '_'+ this[i];
if(list.indexOf(item.substr(1)) == -1){
list.push(item.substr(1));
} else {
c[item] = c[item] == undefined ? 1 : c[item] + 1;
list.push(item.substr(1) + c[item]);
}
}
return list;
}
});
// -------
// 基于正则的模板生成函数
var printT = (T, A, K) => {
var L = [];
A.split(',').map(E => L.push(T.replace(K, E)));
return L.join('');
}
// 基于这个模板,生成多个,用正则替换
// 在 chrome 控制台运行即可
printT(
`SELECT
GROUPID,
'KXL' AS 'NAME', -- 列名
MAX(KXL) as 'MAX', -- 最大值
MIN(KXL) as 'MIN', -- 最小值
AVG(KXL) as 'AVG', -- 平均值
STDEV(KXL) as 'BZC', -- 标准差
(STDEV(KXL)/AVG(KXL)) as 'BYXS', -- 变异系数
COUNT(KXL) as 'YBS', -- 样本数
((1-(1.704/SQRT(COUNT(KXL))+4.678/(COUNT(KXL)*COUNT(KXL)))*(STDEV(KXL)/AVG(KXL)))*AVG(KXL)) as 'BZZ' -- 标准值
FROM Fn_Report_Sycgylb(@oaid, @groupId)
where KXL IS NOT NULL AND KXL not like '*%'
GROUP BY GROUPID
UNION ALL
`
, `KLMD,HG,ZR,BH,HSL,XSL,BHXSL,KXL,BHKYQDDZ,BHKYQDPJ,TRKYQDDZ,TRKYQDPJ,RHXS,BXMLDZ,BXMLPJ,TXMLDZ,TXMLPJ,BSB,KLQDDZ,KLQDPJ,TJFTG,TJFC,ZXRCFTG,ZXRCFNJLC,XGXS,NMCJ`
,/KXL/ig)
// 把列表项目,按顺序替换字符串
var str2item = (str, arr, reg) => {
let list = arr.split(','), j = 0;
return str.replace(reg, (e, i) => list[j++]);
}
// 把列表项目,按顺序替换字符串
str2item(
`
[ActionPermission(Description = "只查看自己的数据", Type = PermissionType.UserSet)]
public ActionResult F_USER_ADD() { return View(); }
[ActionPermission(Description = "只查看自己的数据", Type = PermissionType.UserSet)]
public ActionResult F_USER_DELETE() { return View(); }
`
, `新建用户,删除用户`
, /只查看自己的数据/ig)
str2item(
printT(
` [ActionPermission(Description = "只查看自己的数据", Type = PermissionType.UserSet)]
public ActionResult OnlySelf() { return View(); }
`
, `F_USER_ADD,F_USER_DELETE,F_USER_UPDATE,F_USER_VIEW,F_USER_REPWD,F_ROLE_ADD,F_ROLE_DELETE,F_ROLE_UPDATE,F_ROLE_VIEW,F_SYNC_IMPORT,F_SYNC_DOWNLOAD,F_PROJ_ADD,F_PROJ_DELETE,F_PROJ_UPDATE,F_PROJ_VIEW,F_PROJ_IMPORT,F_ZKXX_ADD,F_ZKXX_DELETE,F_ZKXX_UPDATE,F_ZKXX_VIEW,F_DICT_TABLE,F_ZKXX_IMPORT,F_DICT_CONTENT,F_DICT_CUSTOM,F_DICT_VIEW,F_STAFF_MGT,F_STAFF_VIEW,F_ALL_VIEW,F_ALL_EDIT`
,/OnlySelf/ig)
, `新建用户,删除用户,修改用户,查看用户,重置密码,新建角色,删除角色,修改角色,查看角色,上传数据,下载数据,新建项目,删除项目,修改项目,查看项目,导入项目,新建钻孔信息,删除钻孔信息,修改钻孔信息,查看钻孔信息,数据字典表管理,导入钻孔信息,数据字典内容管理,数据字典自定义表管理,查看数据字典,管理人员信息,查看人员信息,查看所有,编辑所有`
, /只查看自己的数据/ig)
// 把某个固定值,替换为变量
function ToVar(str, K){
let list = 'T',index = 0;
return str.replace(K, (item) => list + (index++) );
}
// 使用
ToVar('ZZ|ZZ|ZZ', /ZZ/ig)
// 通过自定义函数,来替换指定的值
function RepFn(str, R, F){
let index = 0;
return str.replace(R, (item) => F(item, index++));
}
// 使用
RepFn('ZZ|ZZ|ZZ|ZZ|ZZ|ZZ|ZZ|ZZ|ZZ|ZZ|ZZ|ZZ|ZZ|ZZ|ZZ|ZZ|ZZ', /ZZ/ig,
function(i,n){
return i + (n%3+1);
})
// 综合示例代码
// 需求:
// 按照模板把多处内容替换,宽度要求小于40%,间隔显示
RepFn(// 3. 自定义替换固定的变量
str2item(// 2. 按列表,修改变量值
printT(// 1. 基于列表,生成多个数据
`<tr wbdx='AAAAA' style="display:none">
<td class="dcqicon"><img src="../images/light-red.png" width="20" height="15" alt="" /></td>
<td>BBBBB</td>
<td>
<div class="BottomColor">
<div class="UpColor00" style="width: 20%">20%</div>
</div>
</td>
</tr>
`
, `jack,tiger,leo,jonathon,aaron`
,/AAAAA/ig)
,`sophie,rainbow,linda,yolanda,judy`
, /BBBBB/ig)
, /20%">20%/ig,
function(i,n){
let num = (n%3+1);
return `${num}0%">${num}0%`;
})
// 如果数组有重复,就重命名+1,可用于数据库字段命名,文件夹命名
var uniq =(arr) => {
let list = [], c={};
for(let i = 0; i < arr.length; i++){
let item = '_'+ arr[i];
if(list.indexOf(item.substr(1)) == -1){
list.push(item.substr(1));
} else {
c[item] = c[item] == undefined ? 1 : c[item] + 1;
list.push(item.substr(1) + c[item]);
}
}
return list;
}
uniq(['aa','aa','aa',1,1,1,11,12])
Jack commented
// 增加一些模板处理的方法
Object.assign(String.prototype, {
/**
* 用正则替换对应的字符串,并且生成多个模板代码
* 基于模板(列表,正则)
*/
toMany(listStr, reg) {
let list = [];
listStr.split(',').map(item => list.push(this.replace(reg, item)));
return list.join('');
},
/**
* 按顺序替换字符串
* 基于内容(列表,正则)
*/
replaceList(listStr, reg) {
let list = listStr.split(','), index = 0;
return this.replace(reg, (e, i) => list[index++]);
},
/**
* 通过自定义函数,来替换指定的值
* 基于内容(正则,函数)
*/
replaceByFn(reg, fn) {
let index = 0;
return this.replace(reg, (item) => fn(item, (index++)));
}
});
// 模板处理的例子
`<tr wbdx='AAAAA' style="display:none">
<td class="dcqicon"><img src="../images/light-red.png" width="20" height="15" /></td>
<td>BBBBB</td>
<td>
<div class="BottomColor">
<div class="UpColor00" style="width: 20%">20%</div>
</div>
</td>
</tr>
`
.toMany(
`jack,tiger,leo,jonathon,aaron`
,/AAAAA/ig)
.replaceList(
`sophie,rainbow,linda,yolanda,judy`
, /BBBBB/ig)
.replaceByFn(
/20%">20%/ig,
function(i,n){
let num = (n%3+1);
return `${num}0%">${num}0%`;
})
Object.assign(Array.prototype, {
/**
* 如果数组有重复,就重命名+1,可用于数据库字段命名,文件夹命名
*/
uniq() {
let list = [], c={};
for(let i = 0; i < this.length; i++){
let item = '_'+ this[i];
if(list.indexOf(item.substr(1)) == -1){
list.push(item.substr(1));
} else {
c[item] = c[item] == undefined ? 1 : c[item] + 1;
list.push(item.substr(1) + c[item]);
}
}
return list;
}
});
['aa','aa','aa',1,1,1,11,12].uniq();
`AA
AA
BB
AA
11
12`.split('\n').uniq().join('\n')
Jack commented
一个生成fastreport的实例
-- 模板
` <TextObject Name="Text6" Left="18.9" Top="151.2" Width="94.5" Height="18.9" Text="勘察阶段:" Font="宋体, 12pt, style=Bold"/>
<TextObject Name="Text6" Left="113.4" Top="151.2" Width="557.55" Height="18.9" Text="[WYJZBG.KCJD]" Font="宋体, 12pt, style=Bold"/>
`
-- 生成多条
.toMany(
`勘察地址,勘察时间,勘察单位资料,勘察单位,资质等级,项目负责人,职称,钻探劳务单位,资质证书编号,外业人员及上岗证,外业见证的内容,勘察任务书,勘察纲要,勘察纲要变更,变更申请人,变更批准人,原位测试符合程度,测量放点,水位观测,钻探工作量,钻探工作量共计,井探工作量,井探工作量共计,槽探工作量,槽探工作量共计,取土试样原状,取土试样扰动,取水试样,取岩样组,取岩样块,钻孔波速测试孔,钻孔波速测试米,原位测试,动力触探,抽水试验,压水或注水试验,其他原位测试,其他需要说明的资料,见证人和见证单位郑重声明,见证单位,单位法人代表或负责人`
,/勘察阶段/ig)
-- 按顺序替换字符串中的值
.replaceList(
`KCDZ,KCSJ,KCDWZL,KCDW,ZZDJ,XMFZR,ZC,ZTLWDW,ZZZSBH,WYRYJSGZ,WYJZDNR,KCRWS,KCGY,KCGYBG,BGSQR,BGPZR,YWCSFHCD,CLFD,SWGC,ZTGZL,ZTGZLGJ,JTGZL,JTGZLGJ,CTGZL,CTGZLGJ,QTSYYZ,QTSYRD,QSSY,QYYZ,QYYK,ZKBSCSK,ZKBSCSM,YWCS,DLCT,CSSY,YSHZSSY,QTYWCS,QTXYSMDZL,JZRHJZDWZZSM,JZDW,DWFRDBHFZR`
, /KCJD/ig)
-- 修改元素的ID
.replaceByFn(
/Text6/ig,
function(i,n){
return `Text${6+n}`;
})
-- 修改元素的位置
.replaceByFn(
/151.2/ig,
function(i,n){
return `${(151.2+(Math.ceil(n/2)+1)*28.35).toFixed()}`;
})
Jack commented
一个生成字段的的模板
copy(
// 模板
`
/// <summary>钻孔编号</summary>
public int ZKBH { get; set; }
`
.toMany(
// 批量替换字段名称
`KLMD
HG
ZR
BH
HSL
XSL
BHXSL
KXL
BHKYQDDZ
TRKYQDDZ
BXMLDZ
TXMLDZ
BSB
KLQDDZ
TJFTG
TJFC
ZXRCFTG
ZXRCFNJLC
XGXS
NMCJ`.replace(/\n/ig,',')
,/ZKBH/ig)
// 批量替换注释
.replaceList(
`颗粒密度
烘干
自然
饱和
含水率
吸水率
饱和吸水率
孔隙率
饱和抗压强度单值
天然抗压强度单值
变形模量单值
弹性模量单值
泊松比
抗拉强度单值
图解法tg
图解法C
最小二乘法tg
最小二乘法内聚力C
相关系数
内摩擦角`.replace(/\n/ig,',')
, /钻孔编号/ig));