Javascript:从字符串中删除原始字符和重复字符

Javascript:从字符串中删除原始字符和重复字符,javascript,arrays,Javascript,Arrays,我需要的是删除原始字符和它的副本,不管它是小写还是大写。如果大写或小写,也应该保留 这是我当前的代码,但是如果字符串是大写然后是小写,它就无法过滤 const removeDuplicateChar = s => s .split('') .filter( ( cur, index, self ) => self.lastIndexOf( cur ) === self.indexOf( cur ) ) .join('') 实际产量 预期产量 回答代码没有给出预期输出的原

我需要的是删除原始字符和它的副本,不管它是小写还是大写。如果大写或小写,也应该保留

这是我当前的代码,但是如果字符串是大写然后是小写,它就无法过滤

const removeDuplicateChar = s => s
  .split('')
  .filter( ( cur, index, self ) => self.lastIndexOf( cur ) === self.indexOf( cur ) )
  .join('')
实际产量

预期产量


回答代码没有给出预期输出的原因:

indexOf()

这使得
indexOf()
区分大小写

解决方案:

在执行
indexOf

您可以创建一个类似于以下的方法:

function indexOfCaseInsenstive(a, b) {
  a = a.toLowerCase();
  b = b.toLowerCase();

  return a.indexOf(b);
}

function lastIndexOfCaseInsenstive(a, b) {
  a = a.toLowerCase();
  b = b.toLowerCase();

  return a.lastIndexOf(b);
}
或者在代码中使用
toLowerCase()

toLowerCase的魔力 只要在处理检查时使用
.toLowerCase
,而不是在检查之前,因为您将永久性地将结果更改为所有小写,这不是您想要的

const toLowerCase = string => string.toLowerCase
removeDuplicateChar = s => s
  .split('')
  .filter((cur, index, self) => self.map(toLowerCase).lastIndexOf(cur.toLowerCase()) === self.map(toLowerCase).indexOf(cur.toLowerCase()))
诚然,这是一个混乱的版本,但它保留了您的代码,因此您不必做太多更改。

试试这个

var str = "DeadSea";
var s = str.toLowerCase();
var arr = s.split("");
arr.forEach(a => {
    if (arr.indexOf(a) !== arr.lastIndexOf(a)) {
        str = str.replace(new RegExp(a, "gi"), "");
    }
});
console.log(str);

您可以使用小写字符串并使用小写字母来查找

功能唯一{
var l=s.toLowerCase();
返回数组
.from(s,c=>l.indexOf(c.toLowerCase())===l.lastIndexOf(c.toLowerCase())?c:“”)
.加入(“”);
}

log(['services','stress','services','stress','DeadSea'].map(唯一))
您需要比较角色实例的
lastIndexOf
indexOf
,并使用
s
作为参考,这样您就不需要使用
self
并将其再次连接为字符串

const filterDuplicateCharacters = s => s
  .split('')
  .filter((c) => s.toLowerCase().lastIndexOf(c.toLowerCase()) === 
             s.toLowerCase().indexOf(c.toLowerCase()))
  .join('')

这应该更快,因为循环中没有
indexOf

const removeDuplicateChar=s=>{
let counts=Array.from(s.toLowerCase()).reduce(
(counts,char)=>counts.set(char,(counts.get(char)| | 0)+1)和&counts,
新地图());
返回数组.from.filter(字母=>
counts.get(letter.toLowerCase())==1
).加入(“”);
}
['services','stress','services','stress','DeadSea']
console.log(word,RemovedUpplicateChar(word))

)
是的,这很好用。谢谢你,伙计。但是,如果可能的话,我可能仍然需要一个更可读的代码:)genius asusual@SalmanA,stings是不可变的,因此不,它不会更改原始字符串。@NinaScholz抱歉,我没有直截了当地思考。很好地重用了初始参数中的变量,使其简洁易读,这个功能相当慢。它为
s
中的所有元素计算
s.toLowerCase()
两次,通过预先缓存这个不变的值,可以很容易地减少开销
var str = "DeadSea";
var s = str.toLowerCase();
var arr = s.split("");
arr.forEach(a => {
    if (arr.indexOf(a) !== arr.lastIndexOf(a)) {
        str = str.replace(new RegExp(a, "gi"), "");
    }
});
console.log(str);
const filterDuplicateCharacters = s => s
  .split('')
  .filter((c) => s.toLowerCase().lastIndexOf(c.toLowerCase()) === 
             s.toLowerCase().indexOf(c.toLowerCase()))
  .join('')