html区分字段,JS 如何判断字符串是否全为同一个字符?

JS:字符串,长度不为0,如何判断该字符串是否全为同一个字符,全部为同一个字符的示例:0,1,22,AAA。

回答

1. 遍历字符串,逐个比较

for (let i=0;i < str.length;i++){

if (str[0] !== str[i]) {

return false

}

}

2. 使用正则

const reg = /^(.)\1*$/

return reg.test(str)

方法2是真的6啊,第一次见到这种写法。:+1:学好正则能给你一些新的方法处理问题,推荐微信读书中的《正则指引》回复

@t0ken : 赞同赞同方法1:innocent::scream: 方法2牛

都是大佬,我也贴一个自己的菜鸟写法吧。

function onlyOne(str){

let strLength = str.length;

if(strLength === 1){

return true;

}

let tmpSet = new Set(str);

if(tmpSet.size === 1){

return true;

}else{

return false;

}

}

console.log(onlyOne('0')); //true

console.log(onlyOne('1')); //true

console.log(onlyOne('22')); //true

console.log(onlyOne('AAA')); //true

console.log(onlyOne('AB')); //false

方法 onlyOne 判断字符串是否由同一个字符组成。参数为字符串 s

function onlyOne(s){

if (s.length==1)

return true;

else {

s1.split('');

for (i=1;i

if (s[0] != s[1])

return false;

return true;

}

}

直接用 set 去重,看是不是只剩一个就行

new Set(yourString).size === 1

我觉得这个想法是真的秀。对于上面说不如大师傅那个高效,我觉得不一定吧。我觉得这个方法应该是最高效的。我也是这么想的, 性能不差 写的代码还少这个写法可以,但是,效率低下。不如大师傅的那个高效。好想法。🤙🤙🤙

const is_repeat_str = (str) => {

return str === str.slice(0, 1).repeat(str.length);

};

console.log( is_repeat_str('aaaa') ); // true

console.log( is_repeat_str('abaa') ); // false

/^(.)\1*$/.test(‘11111111’)

简洁明了,高性能,支持 Unicode 字符(上面评论中的代码都不支持这点),代码如下:

const isSame = s => {

if (!s) return false

const c0 = String.fromCodePoint(s.codePointAt(0))

for (let c of s)

if (c !== c0) return false

return true

}

isSame("😁😁😁") // true

isSame("aab") // false

isSame("aaa") // true

isSame("a") // true

isSame("😁") // true

isSame("") // false

回复

@前端大师傅 : 亲,声明一下,我是一技术渣子。想问下,V8中match方法的底层实现是怎么实现,我没看源码,我的个人推测也是通知遍历的方式实现的。你说的用正则解这道题效率不高,我不知道从哪里看出来的。还 有一个,就是你result赋值操作的那步,我的理解这个“类短路”操作实质也是if-else的另种写法罢了,实际上都是进行布尔运算。再次声明,没有怼的意思,只是纯粹地想了解下原理。勿恼!回复

@前端大师傅 : 我理解的是,代码不一定是越少越好,而是越简单越好,不要小瞧if-else,所有软件都是基于if-else这样简单的条件的分支之上实现的,再高端的技术也逃不开回复

@前端大师傅 : 如果要考虑IE兼容性又是另一种写法了,我用的是ES6标准。上面代码清晰、性能高、支持unicode,就这些fromCodePoint codePointAt连Ie11都不支持,其实这种啰里八嗦的代码,也拿出来秀,骂人我不如你,可千万不要写代码。你这种一大堆if else组成的也能算代码的话,代码逻辑混乱,除了功能完成之外我看不出有什么好。

new Set('aaa').size === 1

简单高效

切出来第一个然后字符串替换为”最后再判断长度这样是否可行?回复

@左岸恋雪Six : 看我的答案吧。大师傅差的不是一点半点。回复

@microkof : 我测试的是计算时间,大师傅的时间最短。回复

@左岸恋雪Six : 你这实验咋实验的?大师傅效率屎一样应该可以。但是要试一下性能如何。目前实验的情况,大师傅的那种效率最好。

console.time(1);

for (let index = 0; index < 10000; index++) {

let calcDistinctStr = (str) => {

// 大师傅方法 最差,差数十倍

let result = false;

result = ((s => {

let pattern = new RegExp(s.substr(0, 1) + "+", "ig");

return 0 < s.match(pattern).length && s.match(pattern)[0].length == s.length;

})(str));

return result;

// 方法2 比方法3略差

// var res = true;

// var start = str[0];

// for (let i = 0; i < str.length; i++) {

// if (start !== str[i]) {

// res = false

// }

// }

// return res;

// 方法3 最好

// return str === str.slice(0, 1).repeat(str.length);

};

calcDistinctStr('11111111')

}

console.timeEnd(1);

其他未列出的方法也都差不多,大师傅最差。

测试方法:注销其他方法,只留一个方法,不断刷新页面,看输出。

速度不是这么测的啊 这种测多次 得到单位时间运行次数的对 5,088,239 ops/sec ±0.58% (91 runs sampled) 还有就是 大样本和小样本 的结果也是不一样的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值