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<s1.length;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) 还有就是 大样本和小样本 的结果也是不一样的