我目前正在尝试读取文件,将内容和多个数组传递给函数;使用正则表达式查看其中是否匹配,然后替换并最终更新。
我编写的看起来丑陋而笨拙的代码是这样的:
find_and_replace: function(file, ...items) {
let str = _.clone(file);
let valid = {};
let do_escape = true;
let hit;
if (items != null ? items.length : void 0) {
for (let i = 0, len = items.length; i < len; i++) {
let obj = items[i];
try {
for (k in obj) {
let v = obj[k];
if (valid[k] == null) {
valid[k] = v;
}
}
} catch (error) { }
}
try {
str = str.replace('/{{([\s\S]+?)}}/g', function(a, b) {
if (hit = valid[b]) {
if (do_escape) {
return escape(hit);
} else {
return hit;
}
}
return '';
});
} catch (error) {
console.log(error);
}
}
return str;
},
该函数的用法如下:
for (let _i = 0, _len = files.length; _i < _len; _i++) {
let x = files[_i];
if(x.includes('node_modules')) {
continue;
}
builder.find_and_replace(builder.read_file(x), main_config, second_config);
break;
}
此“系统”的功能是从文件中查找任何{{tag}}
个占位符,并从...items
组合数组内部用正确的密钥替换
如果有人能指出正确的方向来减少所需的代码量,我将不胜感激。
答案 0 :(得分:2)
某些简化可能包括使用Object.entries
或Array.reduce
方法
function find_and_replace(file, ...items) {
let str = _.clone(file);
let do_escape = true;
let hit;
if (items != null ? items.length : void 0) {
const valid = items.reduce((valid, obj) => {
Object.entries(obj)
.map([k, v] => {
valid[key] = v;
});
return valid;
}, {});
try {
str = str.replace('/{{([\s\S]+?)}}/g', (a, b) => hit === valid[b] ? (do_escape ? escape(hit) : hit) : '');
} catch (error) {
console.log(error);
}
}
return str;
},
答案 1 :(得分:0)
使用函数剩余参数(...items
)时,总是在items
下获得一个数组,因此if (items != null ? items.length : void 0)
是多余的。
items.reduce((all, obj) => ({...all, ...obj}), {})
从...items
(string, [key, value]) => string.replace(new RegExp(`{{${key}}}`, "gi"), value)
将从对象中查找所有出现的键,并将它们替换为值
const tr = (string, ...items) => "" + Object.entries(items.reduce((all, obj) => ({...all, ...obj}), {})).reduce((string, [key, value]) => string.replace(new RegExp(`{{${key}}}`, "gi"), value), string);
console.log(tr("{{h}} {{w}}!", {h:"Hello"}, {w:"world"}));