我需要的是删除原始字符及其重复项,无论其小写还是大写。如果大小写也应保留
这是我当前的代码,但是如果字符串是大写然后是小写,则无法过滤。
const removeDuplicateChar = s => s
.split('')
.filter( ( cur, index, self ) => self.lastIndexOf( cur ) === self.indexOf( cur ) )
.join('')
实际输出
'services' becomes 'rvic'
'stress' becomes 'tre'
'ServicEs' becomes 'ServicEs'
'streSs' becomes 'treS'
'DeadSea' becomes 'DdS'
预期产量
'services' should be 'rvic'
'stress' should be 'tre'
'ServicEs' should also be 'rvic'
'streSs' should also be 'tre'
'DeadSea' becomes 'S'
答案 0 :(得分:2)
.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()))
当然,这是一个凌乱的版本,但是它保留了您的代码,因此您无需进行太多更改。
答案 1 :(得分:2)
尝试一下。
DefaultHttpFilters
答案 2 :(得分:2)
这应该更快,因为循环内没有indexOf
:
const removeDuplicateChar = s => {
let counts = Array.from(s.toLowerCase()).reduce(
(counts, char) => counts.set(char, (counts.get(char) || 0) + 1) && counts,
new Map());
return Array.from(s).filter(letter =>
counts.get(letter.toLowerCase()) == 1
).join('');
}
['services', 'stress', 'ServicEs', 'streSs', 'DeadSea'].forEach(word =>
console.log(word, removeDuplicateChar(word))
)
答案 3 :(得分:1)
回答为什么您的代码未提供预期的输出:
indexOf()
使用严格相等(===或三重相等运算符使用的相同方法)将searchElement与Array的元素进行比较。
哪个使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()
。
答案 4 :(得分:1)
您可以使用小写的字符串并使用小写字母查找。
function unique(s) {
var l = s.toLowerCase();
return Array
.from(s, c => l.indexOf(c.toLowerCase()) === l.lastIndexOf(c.toLowerCase()) ? c: '')
.join('');
}
console.log(['services', 'stress', 'ServicEs', 'streSs', 'DeadSea'].map(unique));
答案 5 :(得分:1)
您需要比较角色实例的lastIndexOf
和indexOf
,并使用s
作为参考,这样就不需要使用self
并将其加入再次成为字符串。
const filterDuplicateCharacters = s => s
.split('')
.filter((c) => s.toLowerCase().lastIndexOf(c.toLowerCase()) ===
s.toLowerCase().indexOf(c.toLowerCase()))
.join('')