如何动态替换javascript中的字符串

How to dynamically replace string in javascript

本文关键字:javascript 字符串 替换 何动态 动态      更新时间:2023-09-26

我有这个字符串:

var text1 = "Ferrari Mercedes Ferrari Android iPhone LG iPhone iOS";
//text1 could be anything

我有这些数组:

var cars = ['Toyota', 'BMW', 'Ferrari', 'Mercedes'];
var phones = ['Nokia', 'Samsung', 'LG', 'iPhone'];
// cars values are fixed, but number of array could be increased

我想将text1中的每个单词替换为数组中具有相同值的单词/值之一,例如:

  1. text1中的Ferrari将匹配Cars值之一,因此它将被随机替换为BMWToyotaMercedes,而不是Ferrariphones值之一。(假设它被随机替换为BMW)

  2. 第二个Ferrari也将被BMW

  3. 但是text1中的Mercedes不能被BMWMercedes

  4. 代替
  5. 以及text1中与phones中分类的词相同的术语

  6. 我预计结果可能是这样的:

text1 = "BMW Toyota BMW Android Nokia Samsung Nokia iOS";

  • AndroidiOS不会被替换,因为它们不在任何数组列表中。
  • 得到这个的有效方法是什么?

    这是一种方法。

    1. 在1和数组(汽车/电话)长度之间随机生成两个"偏移"数
    2. 创建一个空的'mapper'散列来存储新旧名称的映射
    3. 循环遍历汽车数组中的所有索引值,向您的"namemapper"添加一个值,其中key = cars[index]和value = cars[index + offset % cars。,这将确保每个旧名称映射到一个不同的新名称
    4. 对手机做同样的事情
    5. 分割' '上的字符串以获得一个单词数组(我称之为splitText)
    6. 定义一个空的回答字符串和both = phones + cars
    7. 使用for循环访问splitText
    8. 的每个值
    9. 在for循环中,检查每个单词是否在'both'数组中,您可以通过使用第二个for循环访问数组中的每个字符串并使用===
    10. 检查是否相等来做到这一点
    11. 如果是,将映射器中与此键对应的值附加到回答字符串
    12. 否则,将splitString值附加到您的答案字符串
    13. 添加空格

    代码如下:

    var carOffset = Math.ceil(Math.random() * (cars.length-1));
    var phoneOffset = Math.ceil(Math.random() * (phones.length -1));
    var mapper = {};
    for(var i = 0; i < cars.length; i++){
        j = (i + carOffset) % cars.length;
        mapper[cars[i]]=cars[j];
    }
    for(var i = 0; i < phones.length; i++){
        j = (i + phoneOffset) % phones.length;
        mapper[phones[i]]=phones[j];
    }
    var splitText = text1.split(' ');
    var ansString = '';
    var both = cars + phones;
    for(var i = 0; i < splitText.length; i++){
        var flag = 0;
        for(var j = 0; j< both.length; j++){
            if(splitText[i]===both[j]){
                ansString += mapper[splitText[i]];
                flag += 1;
            }
        }
        if(flag === 0){
            ansString += splitText[i];
        }
        ansString += ' ';
    }
    

    我会使用这个工作流:

    1. 定义每个对象类型的RegEx:'(丰田宝马法拉利| | |奔驰)' gi
    2. 获取给定text1的匹配项
    3. 定义一个javascript关联数组来包含Mathc/Replacement对
    4. 遍历匹配,检查关联数组…if (associativeArray["toyota"] != null){}如果是NEW,则从cars数组中随机选择一个替换项,并从cars数组中删除该项。如果已经存在,则跳过并继续进行下一个MATCH。
    5. 在你检查了每个匹配之后,迭代你的关联数组,为每个项目执行替换。