JavaScript:使用Slice方法获取字符串长度而不使用Length属性

4

我知道,这很奇怪!但为什么这样不起作用?

function getStringLength(string) {

  // see how many substrings > 0 can be built
  // log that number & return

  var subString = string.slice();
  var counter = 0;

  while (subString !== '') {
    counter++;
    subString = subString.slice(counter);
  }

  return counter;
}

var output = getStringLength('hello');

console.log(output); // --> expecting 5, but getting 3 (??)

我真的很想用切片来完成!原始挑战是不使用长度属性,我找到了解决方法,它可以正常工作:

function getStringLength(string) {

  var long = 0;

  while (string[long] !== undefined) {
    long++;
  }

  return long;
}
4个回答

6
你在修改你的字符串,这应该适用于你。

function getStringLength(string) {

  // see how many substrings > 0 can be built
  // log that number & return

  var subString = string.slice();
  var counter = 0;

  while (subString !== '') {
    counter++;
    subString = subString.slice(1);
  }

  return counter;
}

var output = getStringLength('hello');

console.log(output); // 5

主要区别在于,我正在进行的是...
subString = subString.slice(1);

替代

subString = subString.slice(counter);

这通常会将长度减少1个单位


4
问题出在代码 substring.slice(counter) 上。第一次,你截掉了1个字符。然后你从已经被截断的子字符串中再截掉2个字符。无论是每次截取一个字符还是从原始字符串中截取递增的数量,都需要注意这一点。因此可以使用 substring.slice(1) 或者 string.slice(counter)

function getStringLength(string) {

  // see how many substrings > 0 can be built
  // log that number & return

  var subString = string.slice();
  var counter = 0;

  while (subString !== '') {
    counter++;
    subString = substring.slice(1);
  }

  return counter;
}

var output = getStringLength('hello');

console.log(output); 


如果有人在你之前发布了与你完全相同的答案,你应该考虑删除你的答案。 - Ruan Mendes
当我构建我的时候没有答案,但感谢您的反馈。 - Nicholas Tower
我也在写一个答案,但因为已经有类似的答案发布了,所以删除了它。 - Ruan Mendes
谢谢你,Nicholas,你的文本描述非常准确,我明白了我错在哪里。 - marie_antoinette

1
为了达到预期的结果,请使用以下选项。
function getStringLength(arr){
  return arr.lastIndexOf(arr.slice(-1))+1
}

var output = getStringLength('hello');
console.log(output);

https://codepen.io/nagasai/pen/gGPWEE?editors=1111

选项2:由于数组的类型是对象,因此下面的选项也可以使用

function getStringLength(arr){
  return Object.keys(arr).pop()*1 + 1
}

var output = getStringLength('hello');
console.log(output);

https://codepen.io/nagasai/pen/PJZmgg?editors=1111

请查看以下更新的选项,以处理空值和数字。 https://codepen.io/nagasai/pen/GMoQgy?editors=1111
https://codepen.io/nagasai/pen/YrweWr?editors=1111


如果字符串以在字符串中较早出现的字符结尾,则第一种选项将失败。 - Marco de Zeeuw
谢谢@MarcodeZeeuw,我已经更新为lastIndexOf,现在应该可以正常工作了 :) - Naga Sai A
非常接近,但两个选项都不喜欢空字符串哈哈。 - Marco de Zeeuw
哦...谢谢@MarcodeZeeuw :) ...请查看这些更新,仅检查字符串并处理空和字符串参数 :) https://codepen.io/nagasai/pen/GMoQgy?editors=1111 和 https://codepen.io/nagasai/pen/YrweWr?editors=1111 - Naga Sai A

0

也许这是一个稍微简短的答案:

function getStringLength(string) {
  var counter = 0;
  while (string.slice(counter)) {
    counter++;
  }

  return counter;
}

var outputHello = getStringLength('hello');
console.log(outputHello); // 5

var outputEmpty = getStringLength('');
console.log(outputEmpty); // 0


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接