我正在尝试实现以下输出,但是请保持简短。不确定我是否对此采取正确的方法。我希望也只允许在该字段中输入字母。
HTML:
<input type="text" id="input-field" onkeyup="myFunction()">
Js:
const remDup= s=> s.split("").filter((e,i,f)=>f.indexOf(e)==i).sort().join("")
const myFunction = (e) => {
let str = document.getElementById('input-field').value
//Only allow letters no other characters
if(("abcdefghijklmnopqrstuvwxyz ").indexOf(String.fromCharCode(e.keyCode))===-1){
e.preventDefault();
return false;
}
console.log(remDup(str))
}
答案 0 :(得分:2)
如果您迭代字符串,filtering
的逻辑可能会更好,具体取决于每次迭代添加到的Set
中是否存在要迭代的字符的小写版本
请注意,您要做需要在测试之前将字符转换为小写,而当前代码并没有这样做(看起来也不是在检查重复的字符):>
const myFunction = (e) => {
const input = document.getElementById('input-field').value;
const alphaInput = input.replace(/[^a-z]/gi, '');
const haveChars = new Set();
const outputArr = [...alphaInput].filter((char) => {
const lower = char.toLowerCase();
if (haveChars.has(lower)) {
return false;
} else {
haveChars.add(lower);
return true;
}
});
const strWithoutDupes = outputArr.join('');
console.log(strWithoutDupes);
}
<input type="text" id="input-field" onkeyup="myFunction()" value="AbraCadABraAlakAzam">
答案 1 :(得分:1)
您可以使用TabVisible: boolean = true
编写一个稍短的版本:
Set
const input = document.getElementById('input-field');
input.addEventListener('keyup', handleKeyUp, false);
const re = /[a-zA-Z]/;
function handleKeyUp(e) {
// `reduce` over the value comparing the current element
// to a lowercase list of previous iterated letters
const deduped = [...e.target.value].reduce((acc, el) => {
const k = el.toLowerCase();
if (!re.test(el) || acc.tmp.has(k)) return acc;
acc.tmp.add(k);
acc.out.push(el);
return acc;
}, { out: [], tmp: new Set() }).out.join('');
console.log(deduped);
}
答案 2 :(得分:0)
这是解决O(n)时空问题的解决方案。
const removeDups = (léString) => {
const strArray = léString.split('')
const charsSeen = {}
let stripped = ''
strArray.forEach(char => {
if (!charsSeen[char.toLowerCase()]) {
stripped += char
charsSeen[char.toLowerCase()] = true
}
})
return stripped
}
console.log(removeDups('AbraCadABraAlakAzam'))