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('')