如何在javascript

时间:2015-07-18 14:37:33

标签: javascript arrays regex

我有这个字符串:

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中的法拉利一词将与Cars之一匹配,因此它将被 BMW 随机替换, 丰田,或梅赛德斯但不是法拉利,也不是phones值之一。 (假设它被 BMW 随机替换)

  2. 第二个法拉利字也将替换为宝马

  3. text1中的 Mercedes 字不得替换为 BMW Mercedes

  4. 以及适用于text1

  5. 中分类的phones字词的相同字词
  6. 我希望结果可能是这样的:

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

    1. Android iOS 未被替换,因为它们不在任何阵列列表中。
    2. 获得此功能的有效方法是什么?

2 个答案:

答案 0 :(得分:2)

这是一种做法。

  1. 随机生成两个'偏移量' 1和数组长度(汽车/电话)之间的数字
  2. 创建一个空的'映射器' hash用于存储旧名称的映射
  3. 循环显示您的汽车数组中的所有索引值,为您的“名称映射器”添加一个值。使用key = cars [index]和value = cars [index + offset%cars.length],这将确保每个旧名称都映射到一个不同的新名称
  4. 为手机做同样的事情
  5. 将字符串拆分为' '得到一个单词数组(我称之为splitText)
  6. 定义一个空答案字符串,两个= phones + cars
  7. 使用for循环访问splitText的每个值
  8. 在此for循环中,检查每个单词是否都在' both'数组,您可以通过使用第二个for循环访问数组中的每个字符串并使用===
  9. 检查相等性来执行此操作
  10. 如果是,请将映射器中与此键对应的值附加到答案字符串
  11. 否则,将splitString值附加到答案字符串
  12. 添加空格
  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 :(得分:1)

我会使用这个工作流程:

  1. 为每种对象类型定义RegEx:rxCars: \(丰田|宝马|法拉利|奔驰)\ GI
  2. 获取给定text1
  3. 的匹配项
  4. 定义JavasScript关联数组以包含Mathc / Replacement对
  5. 迭代匹配,检查关联数组... if(associativeArray [“toyota”]!= null){} 如果是NEW,则从cars数组中选择一个随机替换项,并从cars数组中删除该项。 如果它已经存在,请跳过并继续下一个MATCH。
  6. 检查完每个匹配后,遍历关联数组,为每个项目执行替换。
  7. 希望这有帮助。