炫意html5
最早CSS3和HTML5移动技术网站之一

JS 如何判断字符串是否全为同一个字符?

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

回答

楼上的方法都比较麻烦,而且效率非常低,内容大同小异:遍历查找。

在下开拓一下思维,转换一个角度两行代码解决:正则表达式用的+原理。

        let calcDistinctStr = (str) => {
            let result = false;
            result = (!!str && 1 < str.length && (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;
        };
        console.log(calcDistinctStr("aaaaaa"));//ture
        console.log(calcDistinctStr("1111"));//ture
        console.log(calcDistinctStr("11112"));//false
        console.log(calcDistinctStr("adfb"));//false
        console.log(calcDistinctStr("aaabaaa"));//false

核心代码:

let pattern = new RegExp(s.substr(0, 1) + "+", "ig");
return 0 < s.match(pattern).length && s.match(pattern)[0].length == s.length;

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

for (let i=0;i < str.length;i++){
  if (str[0] !== str[i]) {
    return false
  }
}

2. 使用正则

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

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

方法 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

性能最高,最简单的方法,秒楼上全部

function match(str){
	let length=str.length;
	if(length%2>0){
		str+=str[ 0 ];
		length++;
	}
	return str.substring(0,length/2)==str.substring(length/2,length);
}

这个明显错的啊 abcabc 就和目标结果不同

function checkResult(str) {
   if (typeof str !== 'string') {
     throw '传入的参数不为字符串类型'
   }
   const strList = str.split('');
   return strList.every(item => item === strList[0]);
}

var str = "aaab";
checkResult(str); // false;

var str2 = 'AAA';
checkResult(str2); // true;

vara str3 = 'ABBB';
checkResult(str3 ); //false

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

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

切出来第一个然后字符串替换为”最后再判断长度这样是否可行?回复 @左岸恋雪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)

还有就是 大样本和小样本 的结果也是不一样的

炫意HTML5 » JS 如何判断字符串是否全为同一个字符?

CSS3教程HTML5教程