如何以不区分大小写的方式删除字符串中字母的重复项,以使字母仅出现一次?

时间:2019-02-05 17:21:00

标签: javascript

我需要创建一个函数来删除重复的字母,而不管它是大写还是小写。

如果我的输入字符串为 FoxfoXtAg ,则预期输出将为 FoxtAg 。我的输出是 FoxfXtAg ,它只会删除小写的 o

我还使用了.toLowerCase(),它给出了预期的输出,但是改变了大小写。

let duplicateLetter = (string) => {

 //check if string only contains letters
 if (!string.match(/^[a-zA-Z]+$/gi)) {
  console.log('does not match')
 }

 //check to see if it is a string
 if(typeof(string) !== 'string') {
  return 'Please return a string'
 }

  //make string lowercase (couldn't find check for case insensitive)
  string = string.toLowerCase()

 //this gets rid of spaces as duplicate characters
 string = string.split(' ').join('')

 //creates set with only unique elements
 let noDuplicates = [...new Set(string)];


 return noDuplicates.join('')

}

console.log(duplicateLetter("FoxfoXtAg"));

3 个答案:

答案 0 :(得分:2)

您可以使用splitreduce

let str = `AbraCadABraAlakAzam`
let op = /^[a-z]+$/gi.test(str) && str
         .split('')
         .reduce((out,inp)=>{
              if(!(out[inp.toLowerCase()] || out[inp.toUpperCase()])){
                out[inp]=1
              }
              return out;
          },{})

console.log(Object.keys(op).join(''))

所以这里的想法是

  1. 首先使用正则表达式测试字符串,仅包含字母。
  2. split将字符串分成数组。
  3. 我们根据字符的首次出现创建密钥。
  4. 下次出现 相同字符 时,我们使用toLowerCase()toUppercase()检查它是否已经存在。因此通过这种方式在输出中,我们可以在删除重复项的同时保持字符的首次出现。
  5. 最后,我们使用Object.keys()获取键,并使用Join()将数组改回字符串。

答案 1 :(得分:1)

您可以使用Array.from()将字符串转换为数组。这使我们可以逐个字母地对其进行迭代。

要进行迭代,最好的选择是reduce(),它用于将数组转换为单个结果(如字符串)。

reduce()内将是不区分大小写的正则表达式,以确定我们是否已经“使用”了该字母。我们只会将字母添加到输出中。

function removeDuplicates(str) {

  let result = Array.from(str).reduce((output, letter) => {
    let re = new RegExp(letter, "i");   //Create case-insensitive regex
    return re.test(output)              //Does our output include that letter already?
      ? output                          //Yes - don't modify the output
      : output+letter                   //No  - add it to the output
  }, "");
  
  return result;

}

console.log( removeDuplicates("HELLOworld") );

答案 2 :(得分:0)

给出问题的输入和预期输出,您可以将输入字符串转换为Array.reverse()然后是.join()数组,使用RegExp {{1} }与/([a-z])(?=\1|.*\1)/ig匹配以匹配.replace(),后跟捕获的字符或后面不是捕获的字符的字符,然后是捕获的字符,再次将字符串转换为数组,a-z然后是{ {1}}

.reverse()