【问题标题】:Replace words in var string by elements of array in JS用JS中的数组元素替换var字符串中的单词
【发布时间】:2019-08-05 21:59:51
【问题描述】:

我的代码自动在字符串中搜索颜色名称并添加随机数后缀并将它们作为元素存储在数组中。

我想要的是用我的数组的新修改元素创建一个新字符串。

当字符串多次出现相同的颜色名称时会出现问题。

我需要的是用我导出的数组的不同元素一一替换这些出现。

(我不想在Array中拆分字符串,将相同的元素替换为一个全新的数组中的另一个数组,然后将其加入一个字符串。我需要修改原始字符串)

例子:

字符串通过用户输入改变,所以如果我有:

 str = ' little red fox is blue and red cat is blue';

然后我的代码找到所有颜色名称并生成一个新数组:

array = [ 'red2354' , 'blue7856' , 'red324', 'blue23467'] ;

(我的代码在每个颜色元素的末尾添加了 RANDOM 后缀,但我的数组的顺序与字符串的出现顺序相同)

期望的输出:

 str = ' little red2354 fox is blue7856 and red324 cat is blue23467 '; 

到目前为止我试过了:

var str = ' little red fox is blue and red cat is blue ';  

//I have split string to Array:

ar1 = [ "little","red","fox","is","blue","and","red","cat","is","blue"];

//var dup = matchmine(ar1) find all color duplicates :

var dup = ["red","blue","red","blue"];

//I've sorted all duplicates to appear only once for option B:

var dup2 = ["red","blue"];

//var res = modify(str) takes all color names and adds random suffixes:  


var res= ["redA" , "blueA" , "redB", "blueB" ] ;

//I have also create a new array with all strings in case I needed to match lengths:

var final = [ "little","redA","fox","is","blueA","and","redB","cat","is","blueB"];




   var i = ar1.length-1;         

       for ( i ; i >= 0; i--) {

    var finalAr = str.replace(ar1[i],final[i]); 
    str = finalAr;}

    alert(finalAr);

问题是循环进行并且第一次替换所有元素。到目前为止一切顺利,但在以下循环中再次替换第一个。

循环结果:

   str = 'little redAB fox is blueAB and red cat is blue ' 

期望的输出:

 str = 'little redA fox is blueA and redB cat is blueB '

【问题讨论】:

  • “我需要修改原来的字符串”:那是不可能的。字符串在 JavaScript 中是不可变的。当您想要更改某些内容时,您总是会创建一个新字符串。
  • 您总是想在第一次出现时添加“A”,在第二次出现时添加“B”等等。或者是什么逻辑?
  • @trincot 逻辑是随机的,它需要重复并在末尾添加额外的字符串。即我的代码发现 red 有 4 个重复项,并计算和存储 red874 等元素。我想要的只是用第一个 redrandom 元素映射第一个红色,用第一个 bluerandom 映射第一个蓝色等
  • 所以你有一个随机数数组?或者你不关心数字是多少(供稍后参考),只要结果有唯一的单词?
  • 顺便说一句,为什么“is”这个词不被认为是重复词?

标签: javascript arrays string replace


【解决方案1】:

您的一些逻辑仍然隐藏在您的问题中,例如您根据什么理由确定哪个单词应该获得后缀,或者该后缀是如何确定的。

所以我的回答是不完整的。我将假设 所有 个重复的单词(包括“is”)。如果您已经知道如何隔离应该考虑的单词,您可以将您的单词选择逻辑注入到我查找重复项的位置。

对于后缀的确定,我提供了一个非常简单的函数,它在每次调用时(按顺序)产生一个唯一的数字。同样,如果您有更合适的逻辑来生成这些后缀,您可以在其中注入您的代码。

我建议您从已识别的单词中创建一个正则表达式,然后在带有该正则表达式的字符串上调用replace,并使用回调参数添加动态后缀。

代码:

function markDupes(str, getUniqueNum) {
    // 1. Get all words that are duplicate (replace with your own logic)
    let dupes = str.match(/\S+/g).reduce(({words, dupes}, word) => ({
        dupes: words.has(word) ? dupes.concat(word) : dupes,
        words: words.add(word)
    }), {words: new Set, dupes: []} ).dupes;
    // Turn those words into a regular expression. Escape special characters:
    dupes = dupes.map(word => word.replace(/[\/\\^$*+?.()|[\]{}]/g, '\\$&'))
                 .join("|");
    let regex = new RegExp(dupes, "g");
    // Make the replacement of duplicate words and call the callback function:
    return str.replace(regex, word => word + getUniqueNum());
}

// Example has two inputs:

// 1. A function that determines the suffix:
//   Every call should return a different value
var getUniqueNum = ((i = 1) => {
    // ... here we choose to just return an incremental number
    //  You may implement some other (random?) logic here
    return () => i++; 
})();

// 2. The input string
let str = 'little red fox is blue and red cat is blue ';

// The call:
console.log(markDupes(str, getUniqueNum));

【讨论】:

  • 太棒了,谢谢。我使用导出随机后缀的代码对其进行了一些自定义,然后我将进行一些测试并返回给您。到目前为止似乎完美无缺。谢谢楼主!
  • 您的回答解决了我的问题,但我的代码仍然马虎。请看一下,看看我现在是否能更好地澄清我的问题。我对您的解决方案的一个问题是我的字符串可能包含唯一的骰子名称,我也想用相应的 %d%=(%) 替换它们。检查我的新示例以更好地理解我的意思。再次感谢!
  • 现在我的回答看起来与你的问题脱节了。我会保持原样,因为我觉得这正在成为一个新问题。我建议你问一个全新的问题,只关注你遇到的一个问题(如果有的话?)。请记住:示例输入、预期输出、您的代码以及它产生的内容。这些是质量问题的关键要素。
  • 感谢您的回复,我是新用户,这是我在这里的第一个问题。您是否建议将问题改回以匹配您的解决方案并创建一个关于如何找到独特的骰子元素并替换它们的新问题,或者保持原样并期望在这里找到整个问题的新方法?
  • 如果您愿意,那确实是一件好事。
【解决方案2】:

制作一个对象,作为替换器的地图:

const replacers =   {
    red: 'redA', 
    blue: 'blueB' 
}

然后将你的字符串拆分成一个单词数组并映射到它上面,随你去替换:

const inputStr = 'this is my red string blue words' 
const stringArr = inputStr.split(' ') 
const result = stringArr.map(word=> replacers[word]?replacers[word]:word). join(' ') 

【讨论】:

  • 问题是我在字符串中有很多“红色”和“蓝色”,我想用不同的替换器替换它们。第一个红色:redA,第二个红色:redB 等。此外,我没有特定的替换,我的代码每次都会搜索字符串并为我的重复项创建新的替换。我无法使用常量替换器创建对象
  • 如果我加入(' ')我的最终数组,它将立即解决我的问题,但这不是我想要解决的方式。
  • @romp,在您的问题中,您似乎在第一个示例中建议您有 inputarray = [ 'redA' , 'blueA' , 'redB', 'blueA' ]。但是在这里你说你没有特定的替换。我认为您需要通过编辑您的问题来解决这种歧义,并明确定义输入的确切内容和不正确的内容。
  • @trimcot 对不起,我的意思是我的代码每次根据字符串导出一个带有修改重复项的新数组。并以我的重复项出现在字符串中的相同顺序将新修改的元素导出到数组。字符串会发生变化,因此每次我有不同的重复项时,每次字符串更改时我的代码都会导出一个新数组。
  • 没问题,但是您能否编辑您的问题以明确定义输入的具体内容和不是输入内容?
猜你喜欢
  • 2021-12-07
  • 2021-07-21
  • 2017-05-14
  • 1970-01-01
  • 2020-11-09
  • 2017-11-03
  • 1970-01-01
  • 1970-01-01
  • 2015-07-03
相关资源
最近更新 更多