<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
// 打印字符串中出现字母最多的次数和索引位置;
// 解决思路 首先我们要循环依次拿到每一个字符串,在声明一个空的对象,然后把遍历的每一个字符串存放到对象里面,再去判断对象里面是不是有过相同的字符串,如果没有相同的就代表着属性值为空的就吧遍历的那个字符串属性值赋值为1就代表着这个字符串第一次出现,如果有相同的就代表着这个字符串里面已经有过一次了那么就++
var str = 'asaiasdciasbdwcacccaaa';
var obj = {}; //声明一个空的对象
for (var i = 0; i < str.length; i++) { //遍历循环拿到每一个字符串
var charS = str.charAt(i) //把拿到得每一个字符串赋值给charS变量 charAt代表着根据索引号拿到对应的字符串这里也可以写成str[i]跟charAt相同
if (obj[charS]) { //首先这里拿到第一个字符串a进行判断,看对象里面a这个属性是否有属性值 如果有属性值就代表着已经有过a这个属性的存在了就++,如果a没有属性值就为undefined undefined转为布尔为false 那么就吧a的属性值为1 后面每个字符依次类推 这里的obj[charS]等同于obj['字符串']
obj[charS]++;
} else {
obj[charS] = 1;
}
//上面代码可以写为三元表达式
// obj[charS] ? obj[charS]++ : obj[charS] = 1
if (obj[charS + 'arr']) { //这里表达的想法跟上面的if语句差不多,只不过这里对象里面存的是返回每个字符串的索引号
obj[charS + 'arr'].push(i) //如果进入到这里面就代表着对应的那个字符串已经有过相同的字符串了,那么只需要把他后来出现相同的字符串索引号位置追加在数组中即可
} else {
obj[charS + 'arr'] = [i] //如果进入到这里面就代表这那个字符串第一次出现,既然是第一次出现,就可以使用数组的方式来存储他的位置i就代表着那个字符串当前的位置
}
}
//这里也是可以改为三元表达式
// obj[charS + 'arr'] ? obj[charS + 'arr'].push(i) : obj[charS + 'arr'] = [i]
var max = 0; //用来判断出现字符串最多的次数
var ch = '' //声明一个空的字符串用于拿到对象的属性
for (var k in obj) { //遍历对象 k是得到属性,obj[k]是得到属性值
if (typeof obj[k] == "number") { //因为我们的对象的里面的属性值,里面有次数也有数组,而我们只想次数进行判断,所以就使用到了typeof 如果是number才进行比较,如果不是number着跳过 注意加上引号
if (obj[k] > max) {
max = obj[k] //拿到了出现字符串最多的次数就相当于拿到了对应的字符串 比如c=8 c就出现了8次 对应的属性就是c了
ch = k //这里就是拿到对应出现次数最多的字符串了,最后就相当于拿到了出现最多的那个字符串次数和位置
}
}
}
console.log(ch, obj[ch], obj[ch + 'arr']); // a 8 , [0, 2, 4, 9, 15, 19, 20, 21] 打印对象得到属性值
</script>
</body>
</html>
打印字符串中出现字母最多的次数和索引位置;
最新推荐文章于 2023-02-22 11:33:30 发布