Javascript JS:替换对象中与模式匹配的所有字符串值?
我正在寻找一种有效的方法来替换对象中的值,如果它们匹配某个模式Javascript JS:替换对象中与模式匹配的所有字符串值?,javascript,lodash,Javascript,Lodash,我正在寻找一种有效的方法来替换对象中的值,如果它们匹配某个模式 var shapes = { square: { attr: { stroke: '###', 'stroke-width': '%%%' } }, circle: { attr: { fill: '###', 'stroke-width': '%%%' } } } 例如,我希望能够用特定形状的颜色替换所有“#####”图案: var
var shapes = {
square: {
attr: {
stroke: '###',
'stroke-width': '%%%'
}
},
circle: {
attr: {
fill: '###',
'stroke-width': '%%%'
}
}
}
例如,我希望能够用特定形状的颜色替换所有“#####”图案:
var square = replace(shapes.square, {
'###': '#333',
'%%%': 23
});
var circle = replace(shapes.circle, {
'###': '#111',
'%%%': 5
});
这将允许我快速设置各种对象的笔划和/或填充值
有没有干净的方法?也许使用Lodash或regex?JavaScript API应该允许您完全做到这一点
您必须首先遍历对象的属性,但这应该非常简单。Plain JS,不需要库:
var形状={
正方形:{
属性:{
笔划:“###”,
“笔划宽度”:“%%”
}
},
圆圈:{
属性:{
填写:“###”,
“笔划宽度”:“%%”
}
}
}
shapes=JSON.parse(
JSON.stringify(shapes).replace(/####/g,“红色”).replace(/%/g,“23”)
)
控制台。日志(形状)代码>在lodash中,您有一个实用函数
您可以使用以将属性的值替换为在替换对象中传递的值。如果替换中没有该值,则使用原始值
函数替换(src,repl){
返回{
属性:转换(src.attr,函数(结果,值,键){
结果[键]=repl[val]| | val;
}, {})
};
}
变量形状={
正方形:{
属性:{
笔划:“###”,
“笔划宽度”:“%%”
}
},
圆圈:{
属性:{
填写:“###”,
“笔划宽度”:“%%”
}
}
};
var square=替换(shapes.square{
'###': '#333',
'%%%': 23
});
变量圆=替换(shapes.circle{
'###': '#111',
'%%%': 5
});
控制台。原木(方形);
控制台日志(圆形)代码>
详述(摆脱lodash依赖和循环处理):
函数replaceStringsInObject(obj、findStr、replaceStr、cache=newmap()){
if(cache&&cache.has(obj))返回cache.get(obj);
const result={};
cache&&cache.set(obj,result);
for(让Object.entries(obj))的[key,value]{
设v=null;
如果(值的类型=='string'){
v=value.replace(RegExp(findStr,'gi'),replaceStr);
}
else if(Array.isArray(值)){
v=值;
对于(变量i=0;i
这是昆汀给出的代码的一个版本
- 它不使用缓存(所以要注意圆圈!)
- 它直接作用于任何对象,例如字符串
- 它只替换整个字符串
- 它替换对象键中的字符串
- 在特殊情况下,它会保持某些Firebase对象完好无损,例如时间戳。这很容易扩展到包括其他类型的直接复制
函数replaceStringsObject(值、findStr、replaceStr){
如果(值的类型==“字符串”){
return findStr==value?replaceStr:value;
}else if(admin.firestore.Timestamp的值instanceof){
返回值;
}else if(admin.firestore.GeoPoint的值实例){
返回值;
}else if(Array.isArray(值)){
返回值.map((arrayItem)=>
ReplaceStringsObject(arrayItem、findStr、replaceStr)
);
}else if(值的类型==“对象”){
const newObj={};
for(让Object.entries(值)的[key,oldInnerValue]{
const newInnerValue=replaceStringsInObject(
旧的内在价值,
findStr,
replaceStr
);
const newKey=key==findStr?replaceStr:key;
newObj[newKey]=newInnerValue;
}
返回newObj;
}否则{
返回值;
}
}
您使用的是什么版本的lodash?使用的是最新版本
function replaceStringsInObject(obj, findStr, replaceStr) {
return _.mapValues(obj, function(value){
if(_.isString(value)){
return value.replace(RegEx(findStr, 'gi'), replaceStr);
} else if(_.isObject(value)){
return replaceStringInObject(value, findStr, replaceStr);
} else {
return value;
}
});
}
function replaceStringsInObject(obj, findStr, replaceStr, cache = new Map()) {
if (cache && cache.has(obj)) return cache.get(obj);
const result = {};
cache && cache.set(obj, result);
for (let [key, value] of Object.entries(obj)) {
let v = null;
if(typeof value === 'string'){
v = value.replace(RegExp(findStr, 'gi'), replaceStr);
}
else if (Array.isArray(value)) {
v = value;
for (var i = 0; i < value.length; i++) {
v[i] = replaceStringsInObject(value, findStr, replaceStr, cache);
}
}
else if(typeof value === 'object'){
v = replaceStringsInObject(value, findStr, replaceStr, cache);
}
else {
v = value;
}
result[key] = v;
}
return result;
}