Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS:替换对象中与模式匹配的所有字符串值?_Javascript_Lodash - Fatal编程技术网

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;
}