使用此.length和.split()的其他方法?

时间:2018-07-07 15:00:10

标签: javascript arrays

我想在不使用.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;
}

4 个答案:

答案 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'));