【问题标题】:Replace string keys with array elements [closed]用数组元素替换字符串键[关闭]
【发布时间】:2019-11-15 23:23:21
【问题描述】:

我有以下代码:

const chaine  =  'lorem {{name}} lorem lorem {{name}}..." ;

我需要用这样的数组元素替换所有 {{name}}

cont list  = ['java', 'regex']  

所以预期的结果是

lorem java lorem lorem regex...

注意:

  • {{name}} 字符串中的数字是可变的
  • 数组元素长度是变量,我们可以有1..N

谢谢

【问题讨论】:

  • {{name}} numbers in string is variable 你这是什么意思,你在说什么数字?
  • 只用你的针分割并用地图替换它。
  • @Keith,在这个例子中我有两个 {{name}},在另一个例子中我有 3 个 {{name}} example 'lorem {{name}} lorem lorem {{name}} lorem {{name}}...”。我需要一个通用的解决方案
  • 如果 {{variable}} 是 variable 那么这可能会有所帮助 stackoverflow.com/questions/56522292/…
  • 如果您的模板为one {{name}} two {{name}} three {{name}} 但只有["alpha", "beta"],会发生什么?或者如果数组包含["alpha", "beta", "gamma", "delta"]

标签: javascript arrays node.js regex ecmascript-6


【解决方案1】:

您可以使用.replace() 使其工作。 演示:

const chaine  =  "lorem {{name}} lorem lorem {{name}}..." ;
const list  = ['java', 'regex'];
var result = chaine.replace(/\{\{name\}\}/g, function(text) {
  return list.shift();
});
console.log(result);

【讨论】:

    【解决方案2】:

    您可以查找替换值并从list 获取项目。

    var string = 'lorem {{name}} lorem lorem {{name}}...',
        list = ['java', 'regex'],
        result = string.replace(/\{\{name\}\}/g, (i => _ => list[i++])(0));
    
    console.log(result);

    一个更高级的版本,为索引的每个属性获取一个对象和一个属性。

    var string = 'lorem {{name}} lorem lorem {{name}}, {{foo}}...',
        replacements = { name: ['java', 'regex'], foo: ['bar'] },
        result = string.replace(/\{\{([^}]+)\}\}/g, (_, key) => {
            if (!(key in replacements)) return key;
            replacements['_' + key] = replacements['_' + key] || 0;
            return replacements[key][replacements['_' + key]++];
        });
    
    console.log(result);

    【讨论】:

    • 哦。第一个例子太棒了。感谢分享。
    • 如果你愿意,也可以从列表中 shift 而不是 IIFE(尽管如果你不先复制它,那会发生变化,ofc)_ => list.shift()
    【解决方案3】:

    const chaine = 'lorem {{name}} lorem lorem {{name}}...';
    const list = ['java', 'regex'];
    
    const textWithEverythingReplaced = list.reduce((textWithReplacedValues, wordToReplaceItWith) => {
      return textWithReplacedValues.replace("{{name}}", wordToReplaceItWith)
    }, chaine);
    
    console.log(textWithEverythingReplaced);

    免责声明

    尽管这段代码可以工作,但算法并不可靠。当您拥有的 {{name}} 多于 replacers 时,它将中断。

    除非您可以验证 {{name}} 的数量与 list.length 的数量相同,否则应该没问题。

    【讨论】:

      【解决方案4】:

      您希望它是通用的,将其制成可重用函数也可能有意义。下面是一个例子。

      const repFn = (str, arr) => {
        let i = 0;
        return str.replace(/{{name}}/g, x =>arr[i ++]);
      }
      
      const chaine  =  "lorem {{name}} lorem lorem {{name}}..." ;
      const list  = ['java', 'regex'];
      
      
      
      console.log(repFn(chaine, list));
      console.log(
        repFn("{{name}}, a few {{name}} can {{name}} up the {{name}} of a thousand",
          ["Sometimes", "words", "sum", "wisdom"]
      ));

      【讨论】:

        猜你喜欢
        • 2021-12-05
        • 2017-05-14
        • 2021-02-11
        • 2014-05-07
        • 1970-01-01
        • 2022-06-17
        • 2014-10-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多