我想在不使用.split()
的情况下拆分下,上和文本框的值,我也想
查找字符串的长度而无需使用.length。有人可以解决我的问题吗,但是
我找不到这个问题的确切逻辑。
var lowercase = "abcdefghijklmnopqrstuvwxyz";
var uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
function Print() {
var input = document.getElementById('demo').value;
document.write(document.getElementById('demo1').innerHTML = toUpper(input));
}
function toUpper(input) {
var upperCase = uppercase.split(""); //other way to split uppercase
var lowerCase = lowercase.split(""); //other way to split lowercase
var inputText = input.split(""); //other way to split input
var newText = "";
var found;
for (var i = 0; i < inputText.length; i++) { //not using .length to other way to find the size of inputText
found = false;
for (var ctr = 0; ctr < lowerCase.length; ctr++) { //not using .length other way to find the size of lowerCase
if (inputText[i] == lowerCase[ctr]) {
found = true;
break;
}
}
if (found) { //true
newText = newText + upperCase[ctr];
} else {
newText = newText + inputText[i];
}
}
return newText;
}
答案 0 :(得分:1)
您可以使用array函数reduce来计算字符串的长度。
Reduce遍历数组中的所有元素,并执行您赋予它的功能以将其减小为一个值,您可以阅读更多的here。 为了减少对字符串的处理,您需要使用Array.from,像这样:
Array.from(lowerCase).reduce((sum, carry) => sum + 1, 0) // 26
Reduce接受一个起始参数,此处我们将其设置为零。
通过这种方式,您不需要使用split或length函数。
您也不需要检查输入是否在字符串中,可以使用charCodeAt()和fromCharCode()。
如果您输入内容并使用Array.from()然后遍历forEach进行遍历,则可以得到如下内容:
function print() {
const input = document.querySelector('#input').value;
document.querySelector('#target').value = stringToUpper(input);
}
function stringToUpper(input) {
let output = "";
Array.from(input).forEach(char => output += charToUpper(char));
return output;
}
function charToUpper(char) {
let code = char.charCodeAt(0);
code >= 97 && code <= 122 ? code -= 32 : code;
return String.fromCharCode(code);
}
<div>
<input id="input" placeholder="enter text here">
</div>
<button onclick="print()">To Upper</button>
<div>
<input id="target">
</div>
关键行是我们获取输出并在其上添加字符(作为上位字符)的地方:
output += charToUpper(char)
如果您不了解箭头功能,则可以阅读更多here
此行:
code >= 97 && code <= 122 ? code -= 32 : code;
只是检查char是否为小写字母(数字介于97和122之间),如果是,则减去32以使其变为大写字母。
减去不加的原因是在utf-16中,字符布局如下:
ABCDEFGHIJKLMNOPQRTUWXYZabcdefghijklmnopqrtuwxyz
有关更多信息,请参见here
答案 1 :(得分:0)
我不知道“拆分textBox的值”是什么意思,但是不使用.length即可确定字符串长度的一种方法是使用for ... of循环并具有计数器增量每次运行以跟踪字符串中的字符数。
let string = 'boo'
let lengthCounter = 0
for (let char of string) {
lengthCounter++
}
//lengthCounter = 3
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of
答案 2 :(得分:0)
您可以定义自己的分割和长度函数:
function mySplit(a){
var counter = 0;
rslt = [];
var val = a[counter];
while(typeof val != "undefined"){
rslt.push(a[counter]);
counter ++;
val = a[counter];
}
return rslt;
}
function myLength(a){
var counter = 0;
var val = a[counter];
while(typeof val != "undefined"){
counter ++;
val = a[counter];
}
return counter;
}
您现在的功能应类似于:
function toUpper(input) {
var upperCase = mySplit(uppercase);
var lowerCase = mySplit(lowercase);
var inputText = mySplit(input);
var newText = "";
var found;
for (var i = 0; i < myLength(inputText); i++) {
found = false;
for (var ctr = 0; ctr < myLength(lowerCase); ctr++) {
if (inputText[i] == lowerCase[ctr]) {
found = true;
break;
}
}
if (found) { //true
newText = newText + upperCase[ctr];
} else {
newText = newText + inputText[i];
}
}
return newText;
}
答案 3 :(得分:0)
最简单的方法是仅使用javascript .toUpperCase()
的内置函数(请参见示例1)。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toUpperCase
否则,如果您坚持使用for.loop
,也可以这样做(请参见示例二)。您不需要split()
函数,因为string
已经是array
个字符了。另外请注意,并非网络中的所有字符都有小写字母,因此逻辑本身就有缺陷。
//REM: This lines are not required.
/*
var lowercase = "abcdefghijklmnopqrstuvwxyz";
var uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
function Print() {
var input = document.getElementById('demo').value;
document.write(document.getElementById('demo1').innerHTML = toUpper(input));
}
*/
//REM: Version 1 (using string.toUpperCase())
(function toUpper1(input){
var tReturn = (input || '').toUpperCase();
console.log('toUpper1', tReturn);
return tReturn
}('abcDEFghiJKL'));
//REM: Version 2 (using your way)
(function toUpper2(input){
var tReturn = '';
if(input && input.length){
for(let i=0, j=input.length; i<j; i++){
tReturn += (input[i] === input[i].toLowerCase()) ? input[i].toUpperCase() : input[i]
}
};
console.log('toUpper2', tReturn);
return tReturn
}('abcDEFghiJKL'));