我有这个字符串:
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
中的每个单词替换为数组中具有相同值的单词/值之一,示例:
text1
中的单词 Ferrari 将匹配Cars
值之一,因此它将被随机替换为 BMW、Toyota 或 Mercedes 但不是 Ferrari 也不是phone
值之一。 (假设它被随机替换为 BMW)第二个 Ferrari 词也将替换为 BMW
但是
text1
中的 Mercedes 词不能替换为 BMW 和 Mercedes同样的术语也适用于
中的单词text1
中分类在phones
我希望结果是这样的:
text1 = "BMW Toyota BMW Android Nokia Samsung Nokia iOS";
- Android 和 iOS 没有被替换,因为它们不在任何数组列表中。
得到这个的有效方法是什么?
最佳答案
这是一种方法。
- 在 1 和数组长度(汽车/电话)之间随机生成两个“偏移”数字
- 创建一个空的“映射器”散列来存储您的新旧名称映射
- 遍历汽车数组中的所有索引值,使用键 = cars[index] 和值 = cars[index + offset % cars.length] 向“namemapper”添加一个值,这将确保每个旧的名称映射到不同的新名称
- 对手机做同样的事情
- 拆分 ' ' 上的字符串以获得单词数组(我称之为 splitText)
- 定义一个空的答案字符串并且两者 = phones + cars
- 使用 for 循环访问 splitText 的每个值
- 在此 for 循环中,检查每个单词是否在“both”数组中,您可以通过使用第二个 for 循环来访问数组中的每个字符串并使用 === 检查是否相等来执行此操作
- 如果是,将映射器中与此键对应的值附加到答案字符串
- 否则,将 splitString 值附加到您的答案字符串
- 添加空格
代码如下:
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 += ' ';
}
关于javascript - 如何在javascript中动态替换字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31492242/